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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:15:00