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

在SQL Server 2008中如何根据指定日期获取往前N个月的对应日期?

解决SQL Server 2008中按指定日获取往前N个月日期的问题

嘿,我明白你现在遇到的问题了——原来的递归CTE逻辑是在计算每个月的最后一天,所以才会得到月末日期,而不是你想要的和@EndDate同一天的日期。咱们来调整一下代码逻辑:

问题根源分析

你原来的代码里,DATEADD(ss, -1, DATEADD(mm, DATEDIFF(m, -1, @EndDate), 0))这一段的作用是:

  1. DATEDIFF(m, -1, @EndDate) 计算从1900-01-01到@EndDate的月份数
  2. DATEADD(mm, ..., 0) 把这个月份数加到1900-01-01上,得到下一个月的第一天
  3. 再减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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:52:38