Вы можете уменьшить это до одной строки кода, которая использует немного математики и некоторые мелочи SQL Engine.
Ответы, которые зависят от DATEPART
, возвращают недетерминированные результаты в зависимости от настройки для DATEFIRST
, который сообщает SQL Engine, какой день недели считать первым днем недели.
Существует способ сделать то, что вы хотите, без риска ошибитьсярезультат, основанный на изменении параметра DATEFIRST
.
Внутри SQL Server днем 0 является 1 января 1900 года, что является понедельником.Мы все использовали этот маленький трюк, чтобы убрать время из GETDATE()
, подсчитав количество дней с 0 дня, а затем добавив это число к 0, чтобы получить сегодняшнюю дату в полночь:
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()),0)
АналогичноДень 3 был 4 января 1900 года. Это важно, потому что этот день был четверг.Приложив немного математики к числу дней и полагаясь на функцию DATEDIFF
, чтобы отбрасывать дроби, что и делает, этот расчет всегда вернет вам следующий четверг:
SELECT DATEADD(DAY, (DATEDIFF(DAY, 3, GETDATE())/7)*7 + 7,3);
Закажите этот ответ за помощь.
Итак, ваш последний запрос сводится к следующему:
Select
getdate() as duedate,
datepart(yy,getdate()) as duedate_yr,
datepart(ww,getdate()) as duedate_ww,
DATEADD(DAY, (DATEDIFF(DAY, 3, GETDATE())/7)*7 + 7,3) as duedate_Weekdue;