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