You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:06:19