在SQL Server 2008中如何根据指定日期获取往前N个月的对应日期?
解决SQL Server 2008中按指定日获取往前N个月日期的问题
嘿,我明白你现在遇到的问题了——原来的递归CTE逻辑是在计算每个月的最后一天,所以才会得到月末日期,而不是你想要的和@EndDate同一天的日期。咱们来调整一下代码逻辑:
问题根源分析
你原来的代码里,DATEADD(ss, -1, DATEADD(mm, DATEDIFF(m, -1, @EndDate), 0))这一段的作用是:
DATEDIFF(m, -1, @EndDate)计算从1900-01-01到@EndDate的月份数DATEADD(mm, ..., 0)把这个月份数加到1900-01-01上,得到下一个月的第一天- 再减1秒,就得到了当前月的最后一天
所以整个递归都是基于月末日期来迭代的,自然结果都是月末啦。
正确的递归CTE写法
我们直接基于@EndDate,每次递归减去一个月,就能得到对应日的日期了:
DECLARE @EndDate DATE = CAST('2020-07-28' AS DATE); DECLARE @NoOfMonths INT = 6; WITH CTE_previousMonths AS ( SELECT @EndDate AS MonthPriorDate, 1 AS months UNION ALL SELECT DATEADD(mm, -1, MonthPriorDate) AS MonthPriorDate, months + 1 AS months FROM CTE_previousMonths WHERE months < @NoOfMonths ) SELECT MonthPriorDate FROM CTE_previousMonths ORDER BY MonthPriorDate DESC; -- 可选,按日期从新到旧排序
结果验证
运行这段代码后,你会得到预期的结果:
2020-07-28 2020-06-28 2020-05-28 2020-04-28 2020-03-28 2020-02-28
额外说明
如果你的@EndDate是31号这类大日期(比如2020-01-31),减去一个月会得到2019-12-31,再减一个月会得到2019-11-30(因为11月没有31号),SQL Server会自动调整到对应月份的最后一天,这是默认的日期处理逻辑,如果有特殊需求可以再调整。
内容的提问来源于stack exchange,提问作者Harsh
相关产品推荐
相关产品推荐

