我有以下疑问,
AND LOG.CHGTS BETWEEN CURRENT DATE - (DAY(CURRENT DATE)-1) DAYS - 1 MONTH AND CURRENT DATE - DAY(CURRENT DATE) DAYS
但它给了我上个月的输出(例如,现在是 9 月。但是,输出将查询去年 8 月 1 日至 31 日的记录,而应该是 9 月 1 日至 30 日)。
我在这里缺少什么?谢谢。
名字
CHGTS
表明你的列是一个时间戳,当比较日期和时间戳时,你必须记住CHGTS <= date '20230930'
在午夜之后就不是真的了。在这些情况下我宁愿不使用 BETWEEN
TRUNC_TIMESTAMP
可在 DB2 LUW、IBM i、Z/OS 中使用
with log (CHGTS) as (
values timestamp(date '2023-08-28', current time)
union all
select
log.CHGTS + 3 day
from log
where log.CHGTS <= date '2023-10-03'
)
select
*
from
log
where
log.CHGTS >= trunc_timestamp(current timestamp, 'MONTH')
and log.CHGTS < trunc_timestamp(current timestamp, 'MONTH') + 1 month
CHGTS |
---|
2023-09-03 09:57:09.000000 |
2023-09-06 09:57:09.000000 |
2023-09-09 09:57:09.000000 |
2023-09-12 09:57:09.000000 |
2023-09-15 09:57:09.000000 |
2023-09-18 09:57:09.000000 |
2023-09-21 09:57:09.000000 |
2023-09-24 09:57:09.000000 |
2023-09-27 09:57:09.000000 |
2023-09-30 09:57:09.000000 |
如果
LOG.CHGTS
具有 Timestamp
数据类型,那么最好使用以下表达式来表示当前月份的开始和结束,并使用 LOG.CHGTS >= I.S AND LOG.CHTS < I.E
。
SELECT CURRENT DATE AS C, I.*
FROM
(
VALUES
(
CURRENT_DATE - DAY (CURRENT_DATE) + 1
, CURRENT_DATE - DAY (CURRENT_DATE) + 1 + 1 MONTH -- - 1
)
) I (S, E)
C | S | E |
---|---|---|
2023-09-20 | 2023-09-01 | 2023-10-01 |
如果
LOG.CHGTS
是 Date
并且您想使用 BETWEEN
,则取消注释掉的 - 1
即可得到 I.E
== last day of the current month
。