如何在db2中查找自上个月28日至当月27日的天数

时间:2017-05-15 05:55:26

标签: db2

我需要在每月28日生成一份报告。 所以我需要运行一个autosys工作。 在那我有一个查询条件 validation_date> =(自上次运行以来的天数) 你能帮我解决这个问题。如何在DB2中实现这个条件? 这是一个月工作。所以我不想在查询中硬编码我以前的运行日期。同时我需要得到满足所有月份的条件。

注意: 如果查询在2月28日运行,则不包括feb 28th。我需要从1月28日(包括)获取数据,直到2月27日(包括在内) 同样对于3月28日运行,我需要从2月28日(包括)获取数据直到3月27日(包括在内)...提前致谢。请帮助

2 个答案:

答案 0 :(得分: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日运行会发生什么,如果是的话,如何处理它)。但是你得到了基本的方法。

答案 1 :(得分:0)

您可以使用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')函数并只放你的列/参数