sql-server - T-SQL 周初返回不正确的日期

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

最佳答案

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

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/

相关文章:

仅使用通配符 (%) 作为值的 SQL LIKE 性能

sql - 何时使用 NEWID 或 NEWSEQUENTIALID 以及为什么

javascript - 脚本不工作。 Lint 说需要分号

Javascript:到日期的毫秒数

mysql - SQL查询从一个表的某些列复制到另一个表中的一列

asp.net - 如何在 SQL Server 表中创建图像列并使用 VB 在 ASP.NET 中检索它

powerbi - Power BI - DAX Measure 计算当前期间流失和重新激活的客户。总数不正确

postgresql - PostgreSQL 中的 DATEADD 等价物

MySQL ADD_DATE 时区问题