在T-SQL中不使用DATEFIRST实现周一至周日年度周数计算
解决方案:基于周一至周日周期的年度周数计算(T-SQL)
核心实现代码
直接用以下表达式即可生成和SET DATEFIRST 1完全一致的年度周数,无需修改数据库设置或创建任何对象:
SELECT BusinessDate, DATEPART(wk, DATEADD(day, 1 - ((@@DATEFIRST + DATEPART(weekday, BusinessDate) - 1) % 7 + 1), BusinessDate ) ) AS YearWeek FROM dbo.BusinessInformation
逻辑说明
周起始日校准:
- 你已实现的
((@@DATEFIRST + DATEPART(weekday, BusinessDate) - 1) % 7 + 1)会返回1(周一)到7(周日)的星期值。 - 通过
1 - 该值计算出当前日期到本周一的偏移天数:周一偏移0天,周日偏移-6天。 - 用
DATEADD将原日期调整到本周一,以此作为周计算的基准日。
- 你已实现的
周数计算:
- 对校准后的周一日期使用
DATEPART(wk, ...),就能自动处理年末年初的跨周问题(比如12月31日若属于下一年第一周,会正确返回1而非错误周数),结果和SET DATEFIRST 1完全一致。
- 对校准后的周一日期使用
验证案例
- 2023年12月31日(周日):校准后为2023年12月25日(周一),周数返回52
- 2024年1月1日(周一):校准后为自身,周数返回1
内容的提问来源于stack exchange,提问作者user3812887
相关产品推荐
相关产品推荐

