db2 - DB2:DB2 报告的双月查询
问题描述
我目前正在编写一个以 DB2 查询作为后端的 Crystal Report。我已经完成了查询,但卡在了它的日期部分。我将每月运行两次——一次在 16 日,一次在下个月的 1 日。这是它应该如何工作的:
- 如果我在当月 16 日运行它,它会给出从当月 1 日到当月 15 日的结果。
- 如果我在下个月的 1 日运行它,它会给我上个月 16 日到上个月最后一天的结果。
这是一份基本的双月报告。我在 T-SQL 中找到了很多这样做的提示,但没有关于如何在 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|
推荐阅读
- python - 在屏幕底部保持提示,同时避免覆盖它
- android - 如何在@Query 中的 WHERE 子句上使用枚举 - Android Room
- excel - 由 VBA 关闭的工作簿未关闭引用,IsAddin 工作簿
- html - 自定义 HTML 模板颜色
- single-page-application - 如果一个网站有多个 URL 路径,它仍然是一个单页应用程序吗?
- discord.js - 如何找到特定用户 discordjs 的最后发送消息
- unit-testing - 在 rust 中编写全面的单元测试
- c# - 使用 ajax 在 .net 核心中正确重新加载部分视图
- c++ - 将具有多个字符的字符转换为具有字符串流的字符串时,空格消失
- google-apps-script - Google Apps 脚本:比较两列并在范围的任何行中条件匹配时执行某些操作