如何在db2中查找从上个月28日到本月27日的天数
Posted
技术标签:
【中文标题】如何在db2中查找从上个月28日到本月27日的天数【英文标题】:how to find number of days since 28th of last month till 27th of current month in db2 【发布时间】:2017-05-15 05:55:26 【问题描述】:我需要在每个月的 28 日生成一份报告。 所以为此我需要运行一个 autosys 作业。 在那我有一个条件查询 validation_date >=(自上次运行以来的天数) 你能帮我解决这个问题吗?我怎样才能在 DB2 中实现这个条件? 这是一个每月的工作。所以我不想在查询中硬编码我以前的运行日期。同时我需要得到一个满足所有月份的条件。
注意: 如果查询在 2 月 28 日运行,则不包括 2 月 28 日。我需要从 1 月 28 日(包括)到 2 月 27 日(包括)获取数据 同样对于 3 月 28 日的运行,我需要从 2 月 28 日(包括)到 3 月 27 日(包括)获取数据...提前谢谢。请帮助
【问题讨论】:
您尝试了哪个查询? 您的日期/时间/时间戳查询应始终为upper-bound exclusive(使用<
)。在这种情况下,说“今天之前”、< CURRENT_DATE
(或其他一些表示实际结束日期的东西)。请注意,这会自动使更高分辨率的时间戳变得安全。
【参考方案1】:
考虑将您的报告生成放在一个过程中,并参数化开始和结束日期。换句话说,有这样的事情:
create procedure monthly_report(
start_date date,
end_date date
)
language sql
begin
... report queries here ...
end
现在您可能拥有更灵活的东西(取决于报告要求)。如果将来您想在不同的日子或不同的时间生成报告,您将能够这样做。
以这种方式设计后,在作业调度脚本中设置日期也可能比在 SQL 中更容易。如果您在 SQL 中执行此操作,则可以执行以下操作:
call monthly_report(
(select
year(current timestamp - 2 months) ||'-'||
month(current timestamp - 2 months) ||'-'||
'28' from sysibm.sysdummy1
),
(select
year(current timestamp - 1 month) ||'-'||
month(current timestamp - 1 month) ||'-'||
'27' from sysibm.sysdummy1
)
)
您可能需要对其进行调整以处理一些极端情况(我不确定您是否关心如果它在本月 29 日运行会发生什么,如果是,如何处理)。但是你得到了基本的方法。
【讨论】:
【参考方案2】:您可以使用 DAY() 函数从日期中提取月份中的某天,并将其用于触发作业。例如,day(param)=28。 其他两个参数可以用日期计算来计算,这里是触发器、date_to 值和 date_from 值的例子
select day(timestamp_format(20170228,'yyyyMMdd') ),timestamp_format(20170228,'yyyyMMdd')- 1 DAY,timestamp_format(20170228,'yyyyMMdd') -1 month from sysibm.sysdummy1;
如果您的参数/列是日期/时间戳,您可以删除 timestamp_format(20170228,'yyyyMMdd') 函数并只输入您的列/参数
【讨论】:
以上是关于如何在db2中查找从上个月28日到本月27日的天数的主要内容,如果未能解决你的问题,请参考以下文章