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 报告的双月查询的主要内容,如果未能解决你的问题,请参考以下文章

Db2 SQL 根据大量数据选择排除行的行

SQL Db2 中的左连接而不是不存在

如何在db2中查找从上个月28日到本月27日的天数

DB2 SQL 错误:SQLCODE=-952,> SQLSTATE=57014,来自 Tibco BW

db2如何查询表结构

Cognos 报告 Hive 数据源很慢?