DB2查询以获取上个月的数据,在当前月份

qnzebej0  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(994)

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

qlfbtfca

qlfbtfca1#

可以很容易地预先计算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处的示例。

hsvhsicv

hsvhsicv2#

在Db2 SQL查询中,有几种方法可以将上个月描述为日期范围。有些datetime 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

包含-包含示例(调用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)

相关问题