T-SQL的一周开始返回错误的日期

时间:2019-01-08 18:32:06

标签: sql-server datediff dateadd

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

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

但是,这将返回如下错误结果:

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 Server级别上设置的时间,或者逻辑上是否存在缺陷?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

dateadd(day, -1, m.MeasureDT)

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

因此,从头开始,“返回上一个星期一”的结果(取决于@@datefirst的设置):

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

除非我弄错了,否则您将避免模数运算,因为datepart()的范围是1到7,并且在偏移1之后,该范围都不会低于零。

答案 1 :(得分:1)

Try this 

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