SQL如何获取指定周期内每周起止日期并自定义首尾周边界
SQL自定义统计周期周边界计算方案
原有代码问题排查
- 首周判定逻辑不严谨,且分支内仅输出固定字符串未给变量赋值,导致首周起始被后续else逻辑覆盖
- 末周用第53周作为判定条件不可靠,每年周数不固定,且分支同样未给结束日期变量赋值,无法生效
- 循环内每次输出两个独立结果集,不符合一行展示周起始、周结束的输出要求
- 未考虑
DATEFIRST配置对周计算的影响,不同实例默认值不同会导致周边界偏移
修改后代码
-- 固定周计算规则:周日为一周第一天,和示例规则匹配 SET DATEFIRST 7 DECLARE @startdate DATE = '2021-01-01' DECLARE @enddate DATE = '2021-12-31' DECLARE @current_week_start DATE DECLARE @current_week_end DATE -- 临时表存储结果,方便最终统一输出 CREATE TABLE #week_range ( week_start_date DATE, week_end_date DATE ) WHILE (@startdate <= @enddate) BEGIN -- 周起始固定取当前循环起始日期,天然保证首周起始为统计周期首日 SET @current_week_start = @startdate -- 计算常规周结束日期 SET @current_week_end = DATEADD(DAY, 7 - DATEPART(DW, @current_week_start), @current_week_start) -- 若常规周结束超过统计周期末日,替换为统计周期末日,天然保证末周结束符合要求 IF @current_week_end > @enddate SET @current_week_end = @enddate -- 插入结果表 INSERT INTO #week_range (week_start_date, week_end_date) VALUES (@current_week_start, @current_week_end) -- 下一周起始为当前周结束+1 SET @startdate = DATEADD(DAY, 1, @current_week_end) END -- 输出最终结果 SELECT * FROM #week_range -- 清理临时表 DROP TABLE #week_range
效果验证
运行上述代码后输出完全符合预期:
- 第一行
week_start_date为2021-01-01,week_end_date为2021-01-02 - 中间周按周日到周六的常规边界计算,如
2021-01-03到2021-01-09 - 最后一行
week_end_date固定为2021-12-31
如果需要调整周起始规则(比如改为周一为一周第一天),只需要把SET DATEFIRST 7修改为SET DATEFIRST 1即可。
内容的提问来源于stack exchange,提问作者sunny nuri
相关产品推荐
相关产品推荐

