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

SQL日期间隔按月份拆分:无需递归CTE的替代查询方案求解

SQL日期间隔按月拆分非递归实现方案

你的原有非递归写法核心问题有两个:

  • 首月的起始日期直接取了月份第一天,没有保留原始的from_date
  • 末月的结束日期直接取了月份最后一天,没有保留原始的to_date

以下是修正后可直接运行的完整代码,输出结果与递归CTE方案完全一致:

DECLARE @d TABLE(value int ,from_date DATE, to_date DATE);
INSERT @d VALUES (7,'2013-11-05','2013-11-25'),(8,'2013-07-05','2013-12-25'),(7,'2013-02-07','2013-04-14');

WITH MonthList AS (
    SELECT 
        DATEADD(MONTH, M, '1899-12-01') AS FirstDay,
        DATEADD(DAY, -1, DATEADD(MONTH, M + 1, '1899-12-01')) AS LastDay,
        DATEADD(MONTH, M + 1, '1899-12-01') AS FirstDayNextMonth
    FROM (
        SELECT TOP 3000 ROW_NUMBER() OVER (ORDER BY s.name) AS M
        FROM master..spt_values s
    ) s
)
SELECT
    t.value,
    IIF(t.from_date > ml.FirstDay, t.from_date, ml.FirstDay) AS mo_from_date,
    IIF(t.to_date < ml.LastDay, t.to_date, ml.LastDay) AS mo_to_date
FROM @d t
INNER JOIN MonthList ml
    ON t.from_date < ml.FirstDayNextMonth
    AND t.to_date >= ml.FirstDay
ORDER BY t.value, mo_from_date

注:你之前贴的示例输出中第三组数据的value写为9/10/11属于手误,修正后代码返回的value与原始插入数据完全一致。当前MonthList生成的3000个月范围覆盖了200多年的时间区间,可满足绝大多数业务场景需求,如有需要可以调整TOP参数扩大范围。

内容的提问来源于stack exchange,提问作者Vats

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 12:39:01