我正在尝试在每个星期的开始之前对查询进行分组,这应该是星期一。我可以使用以下代码从互联网上获得各种参考,以获取一周的第一天:
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级别上设置的时间,或者逻辑上是否存在缺陷?任何帮助将不胜感激。
答案 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