DB2:每两个月查询一次DB2报告

DB2:每两个月查询一次DB2报告,db2,Db2,我目前正在编写一个以DB2查询为后端的Crystal报告。我已经完成了查询,但仍停留在日期部分。我将每月运行两次,一次在16日,一次在下个月的1日。以下是它的工作原理: 如果我在本月16日运行它,它将给出从该月1日到该月15日的结果。 如果我在下个月的1号运行它,它会给我上个月16号到上个月最后一天的结果。 这是一份基本的双月报告。我已经在T-SQL中找到了很多这样做的提示,但是没有关于如何在DB2中实现这一点的有效方法。考虑到月份长度等方面的差异,我很难在逻辑上保持一致。在Db2 for Un

我目前正在编写一个以DB2查询为后端的Crystal报告。我已经完成了查询,但仍停留在日期部分。我将每月运行两次,一次在16日,一次在下个月的1日。以下是它的工作原理:

如果我在本月16日运行它,它将给出从该月1日到该月15日的结果。 如果我在下个月的1号运行它,它会给我上个月16号到上个月最后一天的结果。
这是一份基本的双月报告。我已经在T-SQL中找到了很多这样做的提示,但是没有关于如何在DB2中实现这一点的有效方法。考虑到月份长度等方面的差异,我很难在逻辑上保持一致。在Db2 for Unix、Linux和Windows中,可能会出现如下情况

WHERE
 (CASE WHEN date_part('days', CURRENT date) > 15 THEN yourdatecolum >= this_month(CURRENT date) AND yourdatecolum < this_month(CURRENT date) + 15 days
  ELSE  yourdatecolum > this_month(CURRENT date) - 1 month + 15 DAYS AND yourdatecolum < this_month(CURRENT date)
  END)

查看函数-有多种方法可以实现。也可能有帮助

根据所传递的报告日期,间隔的开始日期和结束日期有两个表达式,您可以在where子句中使用它们。 逻辑如下: 1如果报告日期为一个月的第一天,则: 开始日期是上个月的16日 结束日期是上个月的最后一天 2否则: 开始日期是本月的1号 结束日期为本月15日

SELECT
  REPORT_DATE
, CASE DAY(REPORT_DATE) WHEN 1 THEN REPORT_DATE - 1 MONTH + 15 ELSE REPORT_DATE - DAY(REPORT_DATE) + 1  END AS DATE_START
, CASE DAY(REPORT_DATE) WHEN 1 THEN REPORT_DATE - 1            ELSE REPORT_DATE - DAY(REPORT_DATE) + 15 END AS DATE_END
FROM 
(
VALUES 
  DATE('2020-02-01')
, DATE('2020-02-05')
, DATE('2020-02-16')
) T (REPORT_DATE);
结果是:

|REPORT_DATE|DATE_START|DATE_END  |
|-----------|----------|----------|
|2020-02-01 |2020-01-16|2020-01-31|
|2020-02-05 |2020-02-01|2020-02-15|
|2020-02-16 |2020-02-01|2020-02-15|