需求算法:
根据年份,对该年度具体日期指定周别。
规则:
每月第一个星期日对应的天数是否为5天之后(含5天),
若是,则到该星期日为第一周,
否则到下一个星期日都为第一周;
其后每7天为一周;
第四周一直到月底;
输出示例 (2025年3月)
日期 | 月份 | 周 | |
---|---|---|---|
2025-03-01 | March | 第一周 | |
2025-03-02 | March | 第一周 | |
... | ... | ... | |
2025-03-09 | March | 第一周 | -- 第一个周日为2号,结束日=2+7=9 |
2025-03-10 | March | 第二周 | |
... | ... | ... | |
2025-03-31 | March | 第四周 |
关键逻辑说明
-
全年日期生成:
- 通过
Months
CTE 生成1-12月,再结合master..spt_values
生成每个月的所有日期。
- 通过
-
第一周规则:
-
起始日:始终为每月1号。
-
结束日:
- 若第一个星期日
<5号
,结束日为第一个星期日 +7天
。 - 若第一个星期日
>=5号
,结束日为第一个星期日
。
- 若第一个星期日
-
-
递归生成周范围:
- 从第一周结束日+1天开始,每7天为一周期,直至月末。
- 动态适配月末不足7天的日期。
-
跨月份关联:
- 使用
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
即可测试不同年份。