我在 Oracle DB 中有以下 SQL,我预计会返回 2024 年 3 月 1 日 (01-MAR-24),但它返回的是 01-AUG-24
SELECT TRUNC(TRUNC (SYSDATE, 'MM') - 6, 'MM')
FROM dual
谁能告诉我为什么会这样?我想选择“X”个月前的第一天,并采用上述格式,但这并不符合我的预期。
您将日期截断到月初,然后减去 6 天,最后将值(现在是上个月)截断到该月初。
您可能想要的是
SELECT ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -6) FROM DUAL;
或:
SELECT TRUNC(SYSDATE, 'MM') - INTERVAL '6' MONTH FROM DUAL;
TRUNC(SYSDATE, 'MM')
,将当前日期截断为当月的第一天。给定今天的日期 24-SEP-2024
,它将返回 01-SEP-2024。
TRUNC(SYSDATE, 'MM') - 6
,从当月的第一天减去 6 天。因此,从 01-SEP-2024
中减去 6 天将得到 26-AUG-2024
。
TRUNC(TRUNC(SYSDATE, 'MM') - 6, 'MM')
,将 26-AUG-2024
截断为该月的第一天。所以,26-AUG-2024
变成了01-AUG-2024
也许你需要,
SELECT TRUNC(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -6), 'MM') ;
结果
01-MAR-24
ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -6)
,从当月的第一天减去 6 个月。