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
相关产品推荐
相关产品推荐

