我试图按每周的开始(应该是星期一)对查询进行分组。我从互联网上获得了各种引用资料,可以使用以下代码获取一周的第一天:
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 级别的某些时间设置,或者逻辑中是否存在缺陷?任何帮助将不胜感激。
最佳答案
您可以在使用常规逻辑之前将日期向后调整一天:
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 后,该范围都不会低于零。
关于sql-server - T-SQL 周初返回不正确的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54097670/