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

SQL Server中如何实现以周四为周起始、周三为周结束的日期计算?

解决SQL Server中周四至周三周范围的计算问题

这个问题的核心是SQL Server默认的周起始规则(由@@DATEFIRST控制,通常默认是周日)和你需要的周四起始周不匹配,导致当日期是周四时,原代码会返回上周的周四。下面是两种可靠的解决方法:

方法1:不依赖@@DATEFIRST的通用计算(推荐)

这种方法完全不受服务器DATEFIRST设置的影响,兼容性最好:

WITH CurrentDateContext AS (
    SELECT 
        GETDATE() AS CurrentDate,
        -- 计算当前日期距离1900-01-01(周一)的天数偏移:0=周一,1=周二,2=周三,3=周四,4=周五,5=周六,6=周日
        DATEDIFF(day, '1900-01-01', GETDATE()) % 7 AS DayOffset
)
SELECT 
    -- 计算当前周的周四
    DATEADD(day, 
        CASE 
            WHEN DayOffset >= 3 THEN -(DayOffset - 3)  -- 周四到周日:减去偏移差得到本周四
            ELSE -(DayOffset + 4)                     -- 周一到周三:减去(偏移+4)天得到上周四
        END, 
        CurrentDate
    ) AS ThursdayOfCurrentWeek,
    -- 计算当前周的周三(周四加6天)
    DATEADD(day, 6, 
        DATEADD(day, 
            CASE 
                WHEN DayOffset >= 3 THEN -(DayOffset - 3)
                ELSE -(DayOffset + 4)
            END, 
            CurrentDate
        )
    ) AS WednesdayOfCurrentWeek
FROM CurrentDateContext;

测试你的例子:

  • 当CurrentDate是2021-09-29(周三),返回2021-09-23(周四)和2021-09-29(周三)
  • 当CurrentDate是2021-09-30(周四),返回2021-09-30(周四)和2021-10-06(周三)

方法2:临时修改周起始日

如果你可以临时修改会话的DATEFIRST设置,也可以用更简洁的写法:

-- 设置周四为每周的第一天(DATEFIRST=5,因为周日=1,周一=2...周四=5)
SET DATEFIRST 5;

SELECT 
    -- 获取当前周的第一天(周四)
    DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0) AS ThursdayOfCurrentWeek,
    -- 当前周的最后一天(周三,第一天加6天)
    DATEADD(day, 6, DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0)) AS WednesdayOfCurrentWeek;

-- 可以改回默认设置(如果需要)
SET DATEFIRST 7;

为什么原代码会出错?

你的原代码DATEADD(wk, DATEDIFF(wk, 0, GETDATE()), 3)是基于默认周起始日(周日)计算的:

  1. DATEDIFF(wk, 0, GETDATE())会计算从1900-01-01到当前日期有多少个周边界(周日)
  2. DATEADD(wk, 上述周数, 0)得到的是当前默认周(周日起始)的周一,加3天是该周的周四——但当当前日期本身是周四时,这个默认周的起始是上周日,对应的周四自然就是上周四,和你的需求不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:52:44