Oracle查询获取前一年、当前年、下一年的方案合理性及优化咨询
原方案合理性评估
原方案存在边界场景bug,不属于可靠的生产级解决方案:
- 核心问题是直接加减
365天没有处理闰年逻辑,比如在闰年(如2020年)1月1日执行查询时,sysdate + 365得到的是2020年12月31日,提取到的年份还是2020,不符合“下一年”的预期。 - 虽然大多数日常场景返回结果符合预期,但存在明确的异常触发可能性,不建议正式环境使用。
更优的实现方案
方案1:修正原有逻辑(兼容性最好)
用Oracle内置的ADD_MONTHS函数做年份偏移,自动兼容闰年、月末等特殊日期场景:
with cte as( Select extract(year from ADD_MONTHS(sysdate, -12)) as year from dual union all Select extract(year from sysdate) as year from dual union all Select extract(year from ADD_MONTHS(sysdate, 12)) as year from dual ) Select * from cte
方案2:简化写法(无需多次union all)
用CONNECT BY语法直接生成三行结果,代码更简洁,性能无差异:
SELECT EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, (LEVEL-2)*12)) AS year FROM dual CONNECT BY LEVEL <=3
两种方案均能100%覆盖所有日期边界场景,返回结果稳定可靠。
内容的提问来源于stack exchange,提问作者Pointer
相关产品推荐
相关产品推荐

