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

SQL Server指定日期范围内按特殊规则计算每周起止日期实现方案

SQL Server 自定义周度范围计算实现方案

以下代码可直接运行,完全匹配你要求的周计算规则:

-- 强制设置一周首日为周日,匹配样例规则
SET DATEFIRST 7;

-- 定义输入的日期范围参数
DECLARE @StartDate DATE = '2021-01-01', @EndDate DATE = '2022-12-31';

-- 生成连续日期序列
WITH AllDates AS (
    SELECT @StartDate AS CurrentDate
    UNION ALL
    SELECT DATEADD(DAY, 1, CurrentDate)
    FROM AllDates
    WHERE CurrentDate < @EndDate
),
-- 标记周分界点:每年1月1日、周日为新周起始
WeekMark AS (
    SELECT 
        CurrentDate,
        YEAR(CurrentDate) AS YearNum,
        CASE 
            WHEN MONTH(CurrentDate) = 1 AND DAY(CurrentDate) = 1 THEN 1
            WHEN DATEPART(WEEKDAY, CurrentDate) = 1 THEN 1
            ELSE 0
        END AS IsNewWeekStart
    FROM AllDates
),
-- 生成周分组ID
WeekGroup AS (
    SELECT 
        CurrentDate,
        YearNum,
        SUM(IsNewWeekStart) OVER (ORDER BY CurrentDate ROWS UNBOUNDED PRECEDING) AS WeekGroupId
    FROM WeekMark
)
-- 聚合得到每周起止
SELECT 
    YearNum AS 所属年份,
    ROW_NUMBER() OVER (PARTITION BY YearNum ORDER BY WeekGroupId) AS 年度周序号,
    MIN(CurrentDate) AS 周起始日期,
    MAX(CurrentDate) AS 周结束日期
FROM WeekGroup
GROUP BY YearNum, WeekGroupId
ORDER BY 周起始日期
-- 日期范围超过100天需放开递归层级限制,0表示无限制
OPTION (MAXRECURSION 0);

规则适配说明

  • 代码默认周周期为周日到周六,和你给出的样例输出完全对齐,如果需要调整周起始日,修改SET DATEFIRST的参数即可:1代表周一为周首日,7代表周日为周首日
  • 自动处理年度首尾周截断:每年第一周固定从1月1日开始,最后一周固定到12月31日结束
  • 无需依赖额外日历表,直接替换@StartDate和@EndDate为你需要的查询范围即可使用

内容的提问来源于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 05:09:00