支持 全年日期分配周号 的 SQL Server 代码

3 阅读2分钟

需求算法: 根据年份,对该年度具体日期指定周别。 规则: 每月第一个星期日对应的天数是否为5天之后(含5天), 若是,则到该星期日为第一周, 否则到下一个星期日都为第一周;
其后每7天为一周;
第四周一直到月底;

输出示例 (2025年3月)

日期月份
2025-03-01March第一周
2025-03-02March第一周
.........
2025-03-09March第一周-- 第一个周日为2号,结束日=2+7=9
2025-03-10March第二周
.........
2025-03-31March第四周

关键逻辑说明

  1. 全年日期生成

    • 通过 Months CTE 生成1-12月,再结合 master..spt_values 生成每个月的所有日期。
  2. 第一周规则

    • 起始日:始终为每月1号。

    • 结束日

      • 若第一个星期日 <5号,结束日为 第一个星期日 +7天
      • 若第一个星期日 >=5号,结束日为 第一个星期日
  3. 递归生成周范围

    • 从第一周结束日+1天开始,每7天为一周期,直至月末。
    • 动态适配月末不足7天的日期。
  4. 跨月份关联

    • 使用 a.FirstDay = w.FirstDay 确保日期与对应月份的周范围关联。

其他测试案例

案例1:第一个星期日是5号(>=5)

日期
202X-XX-01第一周
......
202X-XX-05第一周-- 结束日为5号
202X-XX-06第二周
......

案例2:第一个星期日是4号(<5)

日期
202X-XX-01第一周
......
202X-XX-11第一周-- 结束日=4+7=11号
202X-XX-12第二周

此代码将自动遍历全年所有月份,并根据每个月的第一个星期日位置动态划分周范围。修改 @Year 即可测试不同年份。