【问题标题】:DB2 query to fetch last month of data. on current monthDB2 查询获取上个月的数据。当月
【发布时间】:2022-01-13 10:10:52
【问题描述】:

每个月我都必须从 Db2 数据库中获取上个月的记录。如何编写 Db2 查询来获取上个月的数据而不对日期范围进行硬编码?例如,在 2021 年 12 月运行时,查询将返回日期在“2021-11-01”和“2021-11-30”之间的记录,而当我在一个月后运行相同的查询时,这些日期会动态变化。

【问题讨论】:

标签: sql database db2


【解决方案1】:

有几种方法可以在 Db2 SQL 查询中将上个月描述为日期范围。某些日期时间 SQL 函数在 Db2 for z/OS 上不可用,但即便如此,您仍然可以使用日期算术和 LAST_DAY() 函数。

上个月的第一天:LAST_DAY(CURRENT DATE - 2 MONTHS) + 1 DAY

上个月最后一天:LAST_DAY(CURRENT DATE - 1 MONTH)

本月的第一天:LAST_DAY(CURRENT DATE - 1 MONTH) + 1 DAY

包含-排除示例(首选方法):

SELECT ... WHERE someDateTimeColumn >= LAST_DAY(CURRENT DATE - 2 MONTHS) + 1 DAY 
AND someDateTimeColumn < LAST_DAY(CURRENT DATE - 1 MONTH) + 1 DAY

Inclusive-inclusive 示例(调用DATE() 函数将阻止可能跳过某些符合条件的行的隐式类型转换):

SELECT ... WHERE someDateTimeColumn >= LAST_DAY(CURRENT DATE - 2 MONTHS) + 1 DAY 
AND DATE(someDateTimeColumn) <= LAST_DAY(CURRENT DATE - 1 MONTH)

如果您在 Db2 中查询 LUW v11.1 或更高版本,还可以调用 THIS_MONTH() 函数来获取输入月份的第一天。

上个月的第一天:THIS_MONTH(CURRENT DATE - 1 MONTH)

本月的第一天:THIS_MONTH(CURRENT DATE)

包含-排除示例:

SELECT ... WHERE someDateTimeColumn >= THIS_MONTH(CURRENT DATE - 1 MONTH) 
AND someDateTimeColumn < THIS_MONTH(CURRENT DATE)

【讨论】:

  • 您好,我已使用此查询,但未获取上个月的日期数据。仅到 2021 年 11 月 29 日。 SELECT * from NIG.CARTGAR WHERE TIMESTAMP >= LAST_DAY(CURRENT DATE - 2 MONTHS) + 1 DAY AND TIMESTAMP
  • 第二种方法包容性包容性示例不起作用。显示零记录。
  • 第三种方法也只显示截至 2021 年 11 月 29 日的数据。未检索到每月最后一天的数据:
  • 第三种方法奏效了。我采用了日期列(仅保存日期)而不是时间戳列。非常感谢您的支持
  • 我更正了 inclusive-inclusive 示例,还向 DATE 添加了显式转换,以便查询可以使用 TIMESTAMP 数据。
【解决方案2】:

可以很容易地预先计算 cte 中的日期范围,然后在主查询中使用它。假设您的表 t 有一个要过滤的 ts 列,您可以这样做:

with
r as (
  select
    to_date(year(c) || '-' || month(c) || '-01' , 'YYYY-MM-DD') as e,
    to_date(year(p) || '-' || month(p) || '-01' , 'YYYY-MM-DD') as b
  from (
    select current date as c, current date - 1 month as p from sysibm.sysdummy1
  ) x
)
select * 
from t 
cross join r
where t.ts >= r.b and t.ts < r.e

参见db<>fiddle 的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多