SQL Server递归DATEADD查询获取近N年相同日期问题求解
SQL Server递归查询返回最近N年同一日期的调整方案
原代码问题分析
原递归逻辑的日期计算规则错误:递归分支中使用上层递归的step值作为年偏移量叠加上层返回的日期,不仅会出现重复的基准日期,最终输出的日期序列也完全不符合预期。
调整后代码
declare @N int = 4; -- 自定义要返回的最近N年数值 declare @datobserve date = '2021-11-03'; with dates as ( -- 锚点成员:基准日期作为初始值 select @datobserve datobserve, 0 step union all -- 递归成员:直接给上一轮日期减1年 select dateadd(year, -1, datobserve) as datobserve, step - 1 from dates -- 终止条件:保证返回N条数据 where step > -@N + 1 ) select datobserve from dates
逻辑说明
- 将年数封装为
@N变量,调整需求时仅需修改该变量即可,无需改动其他逻辑 - 锚点直接取基准日期,不需要额外做日期计算
- 递归分支每次给上一轮生成的日期减1年,保证每年都是同一月日
- 以
@N=4为例,最终会返回2021-11-03、2020-11-03、2019-11-03、2018-11-03共4条符合要求的数据
特殊场景说明
如果基准日期是闰年的2月29日,SQL Server的dateadd函数会自动将非闰年的对应日期调整为2月28日,符合绝大多数业务场景的预期。
内容的提问来源于stack exchange,提问作者assenuma
相关产品推荐
相关产品推荐

