Получить последнюю дату в пятницу SQL

Я пытаюсь получить последнюю пятницу в SQL Server 2008.

У меня это есть. Он получает начало недели (понедельник), затем вычитает 3 дня, чтобы попасть в пятницу.

declare @recentFriday datetime =  DATEADD(ww, DATEDIFF(dd,0,GETDATE()), 0)-3

Когда это выполняется в течение недели, он получает последнюю пятницу, и это верно. Но при запуске в пятницу (или в субботу) он по-прежнему получает последнюю неделю вместо текущей пятницы в пятницу. Я собираюсь использовать условия if/else, но я уверен, что есть более простой способ.

Ответы

Ответ 1

Это работает для любого ввода и любой настройки DATEFIRST:

dateadd(d, -((datepart(weekday, getdate()) + 1 + @@DATEFIRST) % 7), getdate())

Он работает, корректируя значение дня недели, так что 0 = пятница, имитируя пятницу как начало недели. Затем вычитайте значение дня недели, если не ноль, чтобы получить самую последнюю пятницу.

Изменить: обновлено для работы для любой настройки DATEFIRST.

Ответ 2

DECLARE @date DATETIME = '20110512' -- Thursday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110506

SET @date = '20110513' -- Friday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110513

SET @date = '20110514' -- Saturday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110513
  • Рассчитайте количество дней между известной пятницей (05 января 1900 года) и указанной датой
  • Остаток, оставшийся от деления разницы в 1. на 7, будет дней, прошедших с прошлой пятницы.
  • Вычтите остаток в 2. с указанной даты

Ответ 3

вы можете проверить, находится ли текущий день недели в пятницу или больше DATEPART(dw,GETDATE()), а затем вызывать (SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4) или (SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)-3)

SELECT 
CASE WHEN DATEPART(dw,GETDATE()) >= 5 THEN 
(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4) 
ELSE 
(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)-3) 
END

Ответ 4

Используя известную дату в пятницу (я буду использовать 7 января 2011 г.) в качестве отправной точки, вы можете сделать это:

DECLARE @d DATETIME

SET @d = '2011-05-13' /* Friday */
SELECT DATEADD(DAY, (DATEDIFF (DAY, '20110107', @d) / 7) * 7, '20110107')
/* Returns 2011-05-13 */

SET @d = '2011-05-12' /* Thursday */
SELECT DATEADD(DAY, (DATEDIFF (DAY, '20110107', @d) / 7) * 7, '20110107')
/* Returns 2011-05-06 */

Просто выберите известную пятницу, которая старше любых дат, которые вы будете использовать в своих расчетах.

Ответ 5

SELECT CONVERT(VARCHAR(12),GETDATE()) AS Today,
CASE WHEN (DATEPART(DW,GETDATE())< 7) 
THEN CONVERT(VARCHAR(12),(DATEADD(dd,-(DATEPART(DW,GETDATE())+1),GETDATE())))
ELSE CONVERT(VARCHAR(12),(DATEADD(d,- 1,GETDATE())))
END AS [Last Friday]

Ответ 6

Вот окончательно установленный ориентированный способ достижения последней пятницы:

select Friday from
(
select max(GetDate()) as Friday where datepart(dw, getdate()) = 6
union all
select max((GetDate() - 1)) where datepart(dw, (getdate() - 1)) = 6
union all
select max((GetDate() - 2)) where datepart(dw, (getdate() - 2)) = 6
union all
select max((GetDate() - 3)) where datepart(dw, (getdate() - 3)) = 6
union all
select max((GetDate() - 4)) where datepart(dw, (getdate() - 4)) = 6
union all
select max((GetDate() - 5)) where datepart(dw, (getdate() - 5)) = 6
) x where Friday is not null