首页 > 解决方案 > DB2:DB2 报告的双月查询

问题描述

我目前正在编写一个以 DB2 查询作为后端的 Crystal Report。我已经完成了查询,但卡在了它的日期部分。我将每月运行两次——一次在 16 日,一次在下个月的 1 日。这是它应该如何工作的:

这是一份基本的双月报告。我在 T-SQL 中找到了很多这样做的提示,但没有关于如何在 DB2 中完成此操作的有效方法。考虑到月份长度等方面的差异,我很难理解逻辑以使其始终如一地工作。

标签: db2

解决方案


间隔的开始日期和结束日期有 2 个表达式,具体取决于通过的报告日期,您可以在where子句中使用它们。
逻辑如下:
1) 如果报告日期是一个月的 1 号,那么:
DATE_START是上个月的 16 号 是上个月
DATE_END的最后一天
2) 否则:
DATE_START是 1 号当前月份
DATE_END是当前月份的 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|

推荐阅读