Хитрость заключается в том, чтобы определить, сколько дней до ближайшей пятницы от предложенной даты. Чтобы помочь, посмотрите на целую неделю и количество дней до ближайшей пятницы:
Воскресенье -2
Понедельник -3
Вторник 3
Среда 2
Четверг 1
Пятница 0
Суббота -1
Теперь вам нужна формула для возврата этих результатов. Поскольку воскресенье и понедельник следуют другим правилам недели, необходимы две формулы.
Во-первых, вот воскресенье и понедельник. Он добавляет 1 к значению дня недели, затем принимает отрицательное значение, чтобы применить к добавлению даты. Например, понедельник по умолчанию имеет значение 2 в качестве значения дня недели. (2 + 1) * -1 = -3. -3 + понедельник = пятница.
Вторник - суббота используют аналогичную арифметику: даты возвращают значения дня недели 3, 4, 5, 6 и 7. Нам нужно добавить значения даты 3,2,1,0, -1 соответственно. Формула, чтобы получить это: DW * -1 + 6.
DECLARE @Date AS datetime
SET @Date = '3/1/2010'
SELECT
CASE
WHEN DATEPART(dw, @Date) <= 2
THEN DATEADD(d, -1 * (DATEPART(dw, @Date) + 1), @Date)
ELSE DATEADD(d, DATEPART(dw, @Date) * -1 + 6, @Date)
END AS NearestFriday