Если вам нужна небольшая математика, вы можете использовать функцию datepart () .Передача значения dw
в качестве первого аргумента вернет вам день недели.
select datepart('dw','2018-05-21');
вернет '2' для понедельника, поскольку воскресенье считается первым днем недели.
Используя это в качестве основы, я пришел к следующему.
Решение
declare @d date = GETDATE();
select @d as 'Date',
DATEADD(d, 9-DATEPART(dw,@d) + (1-(DATEPART(dw,@d)+5)/7)*-7, @d) as 'NextMonday',
DATEADD(d,13-DATEPART(dw,@d) + (1-(DATEPART(dw,@d)+5)/7)*-7, @d) as 'NextFriday';
Объяснение
Поэтому идея состоит в том, чтобы рассчитать количество дней доследующий понедельник с текущего дня недели.Так Mon=2 -> +7 days
, Tue=3 -> +6 days
и т. Д. Количество добавляемых дней можно рассчитать по формуле:
- Взятие недели (7 дней, но понедельник = 2, поэтому 7 + 2 =
9
) - С учетом того, что день недели
-DATEPART(dw,@d)
Если бы понедельник был первым днем недели, это был бы он.Применение вышеуказанного в воскресенье добавит 8 дней вместо желаемого 1 дня.Это можно легко исправить, вычтя 7 дней, но это должно происходить только по воскресеньям.
Воскресенье - первый день недели, поэтому
1
Функция, которая возвращает '1' в воскресенье и '0' во все остальные дни
(DATEPART(dw,@d)+5)/7
с помощью целочисленного деления Вычитая из этих значений, получим «1» по воскресеньям и «0» во все остальные дни Умножение на
-7
превращает
+0 days
в
-7 days
только по воскресеньям
Соберите все это вместе, и у вас будет формула для получения в следующий понедельник.Следующая пятница всего на 5 дней дальше, поэтому 9
в начале формулы превращается в 13
.
Чтобы увидеть это в действии (с промежуточными результатами): SQLFiddle