SQL如何实现基于周规则计算当前年份的首日
按周规则计算年度首日SQL实现方案
以下方案基于SQL Server语法编写,适配不同周规则需求:
核心逻辑
按周规则的年度首日,本质是当年第一周的周起始日,最通用的实现逻辑是:取当年符合「第一周判定标准」的某一基准日的周起始日,即可自动兼容第一周落在上一年12月的场景。
方案1:ISO标准周规则(周一为周起始,第一周需包含当年1月4日)
这是全球最常用的周规则,符合你举例的2021年第一周首日为2021-01-04的要求:
-- 先计算当年1月4日 DECLARE @FirstWeekBenchmark DATETIME = DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 3) -- 取基准日所在周的周一作为年度周首日 SELECT DATEADD(wk, DATEDIFF(wk, 0, @FirstWeekBenchmark), 0)
效果示例
- 计算2021年返回:
2021-01-04 00:00:00.000 - 计算2020年返回:
2019-12-30 00:00:00.000(2020年第一周从2019年12月30日开始) - 计算2025年返回:
2024-12-30 00:00:00.000
方案2:美国周规则(周日为周起始,第一周需包含当年1月1日)
如果使用美国常用的周日为周起始的规则,调整基准日和周偏移量即可:
-- 取当年1月1日为基准日 DECLARE @FirstWeekBenchmark DATETIME = DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) -- 取基准日所在周的周日作为年度周首日 SELECT DATEADD(wk, DATEDIFF(wk, -1, @FirstWeekBenchmark), -1)
自定义规则适配
如果你的周规则有特殊判定逻辑,只需修改@FirstWeekBenchmark的取值即可:
- 规则为「第一周包含1月2日」:把基准日改为
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 1) - 规则为「第一周包含1月3日」:把基准日改为
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 2)
内容的提问来源于stack exchange,提问作者maximnl
相关产品推荐
相关产品推荐

