T-SQL начало недели возвращает неверную дату - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь сгруппировать запрос к началу каждой недели, которая должна быть понедельником. У меня есть различные ссылки из Интернета, чтобы получить первый день недели, используя следующий код:

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, которые мне не хватает, или в логике есть недостатки? Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 08 января 2019
Try this 

DATEADD(WEEK, DATEDIFF(WEEK, 0, @Date), 0)-1
0 голосов
/ 08 января 2019

Вы можете откорректировать дату назад на один день, прежде чем использовать обычную логику:

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 ни один из этого диапазона не падает ниже нуля.

...