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

SQL Server周首日(周一)周末日(周日)计算周日归属错误问题

SQL Server 周范围计算异常修复方案

(需求:周首日为周一,周末为周日,周日归属到当前周而非下一周)

问题根因

SQL Server 中DATEPART(dw, 日期)的返回值受全局配置项DATEFIRST影响,默认配置为DATEFIRST=7(即周日为系统默认周首日),此时周日的dw返回值为1,周一返回值为2,原有计算逻辑未适配该规则,导致周日的偏移计算错误,被归属到下一周。

修复代码

方案1:显式指定周首日配置(简单直观)

显式设置当前会话的DATEFIRST为1(周首日为周一),后续计算逻辑直接适配该规则:

declare @date_start datetime
set @date_start = '2021-09-05'
-- 显式设置当前会话周首日为周一
SET DATEFIRST 1

SELECT CAST(DATEADD(dd, -(DATEPART(dw, @date_start))+1, @date_start) AS DATE) as FirstDayOfWeek, 
       CAST(DATEADD(dd, 7-(DATEPART(dw, @date_start)), @date_start) AS DATE) as LastDayOfWeek

方案2:无依赖通用版(推荐)

不修改DATEFIRST配置,兼容所有服务器默认配置,避免影响其他会话逻辑:

declare @date_start datetime
set @date_start = '2021-09-05'

-- 计算周偏移,不受DATEFIRST配置影响
DECLARE @offset INT = (DATEPART(dw, @date_start) + @@DATEFIRST - 2) % 7

SELECT CAST(DATEADD(dd, -@offset, @date_start) AS DATE) as FirstDayOfWeek,
       CAST(DATEADD(dd, 6 - @offset, @date_start) AS DATE) as LastDayOfWeek

效果验证

输入日期为2021-09-05(周日)时,两种方案的输出均为:

  • FirstDayOfWeek = 2021-08-30(周一)
  • LastDayOfWeek = 2021-09-05(周日)
    符合预期需求。

内容的提问来源于stack exchange,提问作者madfrostx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:00:05