2011-05-13 14 views
13

Próbuję uzyskać ostatni piątek w SQL Server 2008.Zdobądź najnowszą piątkową datę SQL

Mam to. Dostaje początek tygodnia (poniedziałek), a następnie odejmuje 3 dni, aby uzyskać piątek.

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

Po uruchomieniu w ciągu tygodnia otrzyma on datę z ostatniego piątku, która jest prawidłowa. Ale jeśli potrwa to w piątek (lub sobotę), to nadal będzie w zeszłym tygodniu zamiast piątku w bieżącym tygodniu. Mam zamiar użyć, jeśli/else warunki, ale jestem pewien, że jest łatwiejszy sposób.

+0

możliwy duplikat [Pokaż ostatnią niedzielę] (http://stackoverflow.com/questions/1794697/find-last-sunday). Podobny do odpowiedzi Joe – gbn

Odpowiedz

12

To działa na każdym wejściu i dowolnym ustawieniu DATEFIRST:

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

It działa poprzez dostosowanie wartości dnia tygodnia, tak aby 0 = piątek, symulując piątek jako początek tygodnia. Następnie odejmij wartość dnia tygodnia, jeśli nie jest ona równa zero, aby uzyskać ostatni piątek.

Edytuj: Zaktualizowany do pracy dla dowolnego ustawienia DATEFIRST.

+0

Nie jestem zwolniony, ale myślę, że to, co było przed tobą, edytuj swoje pytanie. – RRUZ

+0

@RRUZ: Rzeczywiście, nie ma już upadku. – mellamokb

+0

Witam @mellamokb, Intryguje mnie ta linia kodu, którą napisałeś. Mam scenariusz, w którym być może będę musiał go użyć, aby w jednym skrypcie mógł znaleźć ostatniego czwartka lub w inny ostatni poniedziałek. Co muszę zmienić w kodzie, aby uzyskać taki poziom elastyczności? Czy po prostu zmieniam "+1" na "+2", aby pobrać ostatnie czwarte na przykład? W jaki sposób twój kod tworzy piątek = 0? –

2

Korzystanie znaną piątek datę (użyję sty 7, 2011) jako punkt wyjścia, można to zrobić:

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 */ 

Wystarczy wybrać znany w piątek, że jest starszy niż jakichkolwiek terminach będziesz być używając w swoich obliczeniach.

4

można sprawdzić, czy bieżący dzień tygodnia jest piątek lub większa DATEPART(dw,GETDATE()) a następnie zadzwonić (SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4) lub (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 
+0

Jest to zależne od ustawień "@ DATEFIRST". Jeśli spróbuję 'SET DATEFIRST 2' zwraca' 2011-05-06', Dla 'SET DATEFIRST 1' zwraca' 2011-05-13' –

+0

@Martin, Zgadzam się z tobą, ale OP z łatwością może dodać tę zmienną do proponowanego SQL. – RRUZ

0

Oto zupełnie zorientowanych zestaw sposobem achive ostatni piątek:

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 
5
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 
  1. Oblicz liczbę dni pomiędzy znanym piątek (05 Jan 1900) i dana data
  2. Pozostała część z podzielenia różnicy w 1. przez 7 będzie liczbą dni, które upłynęły od ostatniego piątku
  3. Odejmij resztę w 2. od M dany dzień
+0

Dzięki za wyjaśnienie – James

1
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] 
Powiązane problemy