如何在Oracle中每月自动获取上月数据(含1月取去年12月场景)
解决Oracle数据库获取上月数据的SQL问题
原SQL的问题
你写的SQL存在语法错误,MONTH from START_DTM不是Oracle支持的语法。而且只匹配月份会导致逻辑漏洞——比如今年1月会误匹配出去年1月的数据,因为两者月份都是1,必须同时匹配年份和月份才能准确锁定上月数据。
正确的SQL写法
推荐两种可靠的实现方式,均能自动处理1月获取去年12月数据的场景:
方法1:通过日期范围精准匹配
SELECT HISTORY_ID, START_DTM FROM LEM.LEM_ALERT_HISTORY WHERE START_DTM >= TRUNC(ADD_MONTHS(SYSDATE, -1), 'MONTH') AND START_DTM < TRUNC(SYSDATE, 'MONTH');
- 逻辑说明:
TRUNC(ADD_MONTHS(SYSDATE, -1), 'MONTH')返回上月第一天(比如当前是2025年1月,就返回2024-12-01)TRUNC(SYSDATE, 'MONTH')返回当前月第一天,用<而非<=可以避免误包含当前月零点的边界数据
方法2:提取年月进行匹配
SELECT HISTORY_ID, START_DTM FROM LEM.LEM_ALERT_HISTORY WHERE EXTRACT(YEAR FROM START_DTM) = EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -1)) AND EXTRACT(MONTH FROM START_DTM) = EXTRACT(MONTH FROM ADD_MONTHS(SYSDATE, -1));
- 逻辑说明:同时校验
START_DTM的年份和月份是否与上月一致,当前为1月时,ADD_MONTHS(SYSDATE, -1)会自动返回去年12月的日期,因此能精准匹配出去年12月的数据
关于1月的特殊场景
上面两种写法都无需额外修改逻辑,ADD_MONTHS函数会自动处理跨年的月份计算,当前月份为1月时,ADD_MONTHS(SYSDATE, -1)会直接返回去年12月的日期,因此能正确获取目标数据。
内容的提问来源于stack exchange,提问作者ben jjm
相关产品推荐
相关产品推荐

