You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:39:00