【问题标题】:T-SQL beginning of week returns incorrect dateT-SQL 周初返回不正确的日期
【发布时间】:2019-01-08 18:32:06
【问题描述】:

我试图在每周的开始(应该是星期一)之前对查询进行分组。我有各种来自互联网的参考资料,可以使用以下代码获得一周的第一天:

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)

结果是“2018 年 1 月 8 日”。显然,一周不应从相关日期后的第二天开始。

我尝试通过“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 级别设置了一些时间,或者我缺少逻辑上的缺陷?任何帮助将不胜感激。

【问题讨论】:

  • 如果每周的开始应该是星期一,为什么你设置它是星期日 (SET DATEFIRST 7)?
  • 对不起,安德烈,错字应该是 1,如上面的注释所示。

标签: sql-server datediff dateadd


【解决方案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 之后,该范围都不会低于零。

【讨论】:

  • 感谢 shawnT00,这似乎可行,我只是担心我遗漏了一些东西,或者对 datediff 的工作方式缺乏了解。添加静态 -1 会成为问题几年而不是其他问题吗?
  • 年份不会影响任何事情。最终计算只是“四舍五入”到前一个星期一,无论它属于哪一年。
【解决方案2】:
Try this 

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

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 2021-04-06
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多