在SQL Server中按不同ID的时间区间生成周末(周六)结束日期
SQL Server 按ID生成对应时间范围所有周六日期方案
实现逻辑
- 利用递归CTE生成每个ID时间范围内的连续周日期序列,不需要额外依赖日期维度表
- 自带周六校验逻辑,兼容不同SQL Server实例的周起始日配置
完整实现代码
-- 替换下方的YourSourceTable为你实际存储ID、minDate、MaxDate的源表名 WITH GenerateWeekends AS ( -- 锚点:取每个ID的最小日期作为起始值 SELECT ID, minDate AS WeekEndDate, MaxDate FROM YourSourceTable UNION ALL -- 递归:每次加7天,直到超出当前ID的最大日期限制 SELECT ID, DATEADD(DAY, 7, WeekEndDate), MaxDate FROM GenerateWeekends WHERE DATEADD(DAY, 7, WeekEndDate) <= MaxDate ) SELECT ID, WeekEndDate FROM GenerateWeekends -- 通用周六校验,不依赖实例@@DATEFIRST配置 WHERE DATENAME(WEEKDAY, WeekEndDate) = 'Saturday' ORDER BY ID, WeekEndDate -- 若单ID时间跨度超过100周,取消下一行注释放开递归限制 -- OPTION (MAXRECURSION 0)
特殊场景适配
- 如果你源表中存在minDate不是周六的情况,只需要将锚点部分的
minDate AS WeekEndDate替换为以下逻辑,即可自动取时间范围内的第一个周六作为起始:DATEADD(DAY, (7 - DATEPART(WEEKDAY, minDate) + @@DATEFIRST) % 7, minDate) AS WeekEndDate
示例返回结果(以ID=102为例)
ID WeekEndDate --------------------- 102 2021-08-07 102 2021-08-14 102 2021-08-21
内容的提问来源于stack exchange,提问作者Xiaofan Chen
相关产品推荐
相关产品推荐

