求助:使用T-SQL从日期范围提取单个日期并生成7天数据集
生成指定日期范围内的连续7天数据集(分两组)
你当前的DATEADD(DAY, 7, StartDate)只会返回单个日期(起始日期往后推7天的那天),没法生成连续的7天序列。要实现需求,得结合递归CTE或者数字辅助表,用DATEADD逐天累加生成日期。
以下是针对SQL Server的实现示例(其他数据库语法略有调整,但核心逻辑一致):
1. 生成第一周(起始日期开始的7天)
-- 替换代码中的'2022-12-12'为你的StartDate WITH WeekOneDates AS ( SELECT CAST('2022-12-12' AS DATE) AS DateValue UNION ALL SELECT DATEADD(DAY, 1, DateValue) FROM WeekOneDates -- 控制生成7天:起始日期 + 6天(包含起始日共7天) WHERE DateValue < DATEADD(DAY, 6, '2022-12-12') ) SELECT DateValue AS WeekOne FROM WeekOneDates OPTION (MAXRECURSION 0); -- 解除递归次数限制,避免报错
执行后会得到你期望的结果:
2022-12-12 2022-12-13 2022-12-14 2022-12-15 2022-12-16 2022-12-17 2022-12-18
2. 生成第二周(第一周结束后次日开始的7天)
对应示例中2022-12-19至2022-12-25的范围:
WITH WeekTwoDates AS ( -- 从第一周最后一天的次日开始 SELECT DATEADD(DAY, 7, '2022-12-12') AS DateValue UNION ALL SELECT DATEADD(DAY, 1, DateValue) FROM WeekTwoDates -- 控制生成7天:起始日期 +13天(包含起始日共7天) WHERE DateValue < DATEADD(DAY, 13, '2022-12-12') ) SELECT DateValue AS WeekTwo FROM WeekTwoDates OPTION (MAXRECURSION 0);
3. 合并两个周的数据集(带周标识)
如果需要在一个结果集中区分两个周的日期:
WITH AllDates AS ( SELECT CAST('2022-12-12' AS DATE) AS DateValue, 1 AS WeekNumber UNION ALL SELECT DATEADD(DAY, 1, DateValue), -- 判断当前日期属于第一周还是第二周 CASE WHEN DATEADD(DAY, 1, DateValue) <= DATEADD(DAY, 6, '2022-12-12') THEN 1 ELSE 2 END FROM AllDates -- 总共生成14天(两个7天周期) WHERE DateValue < DATEADD(DAY, 13, '2022-12-12') ) SELECT CASE WeekNumber WHEN 1 THEN DateValue END AS WeekOne, CASE WeekNumber WHEN 2 THEN DateValue END AS WeekTwo FROM AllDates OPTION (MAXRECURSION 0);
替代方案:用数字辅助表
如果你有一个包含0-6数字的辅助表(比如Numbers表),可以简化写法:
-- 生成第一周 SELECT DATEADD(DAY, n.Number, '2022-12-12') AS WeekOne FROM Numbers n WHERE n.Number BETWEEN 0 AND 6; -- 生成第二周 SELECT DATEADD(DAY, n.Number +7, '2022-12-12') AS WeekTwo FROM Numbers n WHERE n.Number BETWEEN 0 AND 6;
内容的提问来源于stack exchange,提问作者Anthony Franz
相关产品推荐
相关产品推荐

