T-SQL 周初 returns 日期不正确

T-SQL beginning of week returns incorrect date

我试图在每周开始时对查询进行分组,这应该是星期一。我从互联网上获得了各种参考资料,可以使用以下代码获取一周的第一天:

DATEADD(WEEK, DATEDIFF(WEEK, 0, @Date), 0)

然而,这个returns一个不正确的结果如下:

SET DATEFIRST 7

DECLARE @Date DATE
SET @Date = '1/7/2018'

SELECT DATEADD(WEEK, DATEDIFF(WEEK, 0, @Date), 0)

结果是“1/8/2018”。显然,一周不应该在相关日期之后的第二天开始。

我尝试通过 "SET DATEFIRST = 1" 设置星期几,但这没有任何影响

这是我要完成的示例:

SELECT 
    DATEADD(WEEK, DATEDIFF(WEEK, 0, m.MeasureDT), 0) as StartOfWeek,
    SUM(m.NumeratorVAL) AS Numerator
FROM 
    Database.Schema.Table AS m
GROUP BY 
    DATEADD(WEEK, DATEDIFF(WEEK, 0, m.MeasureDT), 0)
ORDER BY 
    DATEADD(WEEK, DATEDIFF(WEEK, 0, m.MeasureDT), 0)

因此,每周从星期一开始,但包括前一个星期日。在系统级别或 SQL 服务器级别是否有一些时间设置我丢失了,或者逻辑上是否存在缺陷?任何帮助将不胜感激。

您可以在使用常规逻辑之前将日期向后调整一天:

dateadd(day, -1, m.MeasureDT)

或者按照此处的说明一步完成:https://www.itprotoday.com/sql-server/normalizing-first-day-week

所以在我的脑海中,"go back to prior Monday" 可以得出(取决于 @@datefirst 设置):

dateadd(day, datepart(weekday, m.MeasureDT) - 1, m.MeasureDT)

除非我弄错了,否则您将避免模运算,因为 datepart() 的范围是从 1 到 7,并且在偏移 1 之后 none 该范围落在零以下。

Try this 

DATEADD(WEEK, DATEDIFF(WEEK, 0, @Date), 0)-1