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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:48:05