如何用SQL Server将日期区间行拆分为单日行?
解决方案:SQL Server日期区间拆分行
针对你的需求,我们可以使用**递归CTE(公共表表达式)**来实现日期区间的逐行拆分,这个方法简单直接,适合你提到的极小数据集场景,且能正确处理多ID的情况:
WITH DateRangeCTE AS ( -- 锚点:获取原始表的所有记录 SELECT ID, STARTDATE AS CurrentDate, ENDDATE FROM YourTable UNION ALL -- 递归:逐天生成日期,直到覆盖整个区间 SELECT ID, DATEADD(DAY, 1, CurrentDate) AS CurrentDate, ENDDATE FROM DateRangeCTE WHERE CurrentDate < ENDDATE ) SELECT ID, CurrentDate AS STARTDATE, CurrentDate AS ENDDATE FROM DateRangeCTE ORDER BY ID, CurrentDate;
逻辑说明:
- 锚点成员:先读取原始表的每一行数据,把
STARTDATE作为起始日期,保留ID和ENDDATE用于后续递归判断。 - 递归成员:每次给当前日期加1天,直到生成的日期等于原始的
ENDDATE,确保区间内的每一天都被生成。 - 最终查询:将生成的日期同时作为新的
STARTDATE和ENDDATE,并按ID和日期排序,得到你需要的结果结构。
这个方案会自动处理不同ID的独立日期区间,不会出现多ID冲突的问题,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Insan Cahya
相关产品推荐
相关产品推荐

