Oracle SQL如何查询小于等于去年当月及更早的所有记录
解决方案
核心是使用Oracle内置的TRUNC函数对日期按月份截断,规避原写法精确到日匹配的问题,实现逻辑非常简洁。
实现逻辑
- 用
TRUNC(时间值, 'MM')可以将时间截断到当月第一天0点,自动忽略日、时、分、秒的差异 - 先将当前系统时间戳截断到当月第一天,再往前推12个月,得到去年当月第一天的时间阈值
- 只要生日字段按月份截断后的值小于等于这个阈值,就满足「去年当月及更早」的筛选条件,自动包含去年当月所有日期的记录
最终查询语句
SELECT * FROM 你的表名 -- 若实际表名为BDAY可直接替换为BDAY WHERE TRUNC(BDAY, 'MM') <= ADD_MONTHS(TRUNC(systimestamp, 'MM'), -12) ORDER BY BDAY DESC;
效果验证
以你给出的2021年8月15日执行查询的场景为例:
- 计算得到的阈值为
2020-08-01 00:00:00 - 2020年8月所有日期截断后都等于阈值,会被全部保留
- 2020年9月及之后的日期截断后大于阈值,会被排除,完全匹配你给出的预期返回结果
性能优化建议
如果表数据量较大,可以为BDAY字段创建函数索引,避免全表扫描:
CREATE INDEX idx_bday_trunc_mm ON 你的表名(TRUNC(BDAY, 'MM'));
内容的提问来源于stack exchange,提问作者user2125853
相关产品推荐
相关产品推荐

