DB2:DB2 报告的双月查询
Posted
技术标签:
【中文标题】DB2:DB2 报告的双月查询【英文标题】:DB2: Bi-monthly query for a DB2 report 【发布时间】:2020-02-03 21:18:32 【问题描述】:我目前正在编写一个以 DB2 查询作为后端的 Crystal Report。我已经完成了查询,但卡在了它的日期部分。我将每月运行两次——一次在 16 日,一次在下个月的 1 日。以下是它的工作原理:
如果我在当月 16 日运行它,它会给出从当月 1 日到当月 15 日的结果。 如果我在下个月 1 日运行它,它会给出上个月 16 日到上个月最后一天的结果。这是一份基本的双月报告。我在 T-SQL 中找到了很多这样做的提示,但没有关于如何在 DB2 中完成此操作的有效方法。考虑到月份长度等方面的差异,我很难理解逻辑以使其始终如一地工作。
【问题讨论】:
【参考方案1】:间隔的开始日期和结束日期有 2 个表达式,具体取决于通过的报告日期,您可以在 where
子句中使用它们。
逻辑如下:
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|
【讨论】:
【参考方案2】:在 Db2(适用于 Unix、Linux 和 Windows)中,它可能是 WHERE
类似的条件
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)
查看THIS_MONTH 函数 - 有多种方法可以做到这一点。 DAYS_TO_END_OF_MONTH 也可能会有所帮助
【讨论】:
以上是关于DB2:DB2 报告的双月查询的主要内容,如果未能解决你的问题,请参考以下文章