2011-05-13 190 views
13

我試圖在SQL Server 2008中獲得最近的星期五。獲取最近一個星期五的日期SQL

我有這個。它得到本週開頭(星期一),然後減去3天得到星期五。

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

當這一週運行時,它得到上週五的日期是正確的。但是在週五(或週六)運行時,它仍然會獲得上週的日期,而不是當週的週五。我即將使用if/else條件,但我確定有一個更簡單的方法。

+0

可能重複的[查找上星期日](http://stackoverflow.com/questions/1794697/find-last-sunday)。類似喬的回答 – gbn

回答

12

這適用於任何輸入和DATEFIRST任何設置:

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

它通過調整星期值來進行工作,以便0 =星期五,模擬星期五爲星期一開始。然後減去週日值,如果非零,以獲得最近的星期五。

編輯:已更新爲適用於任何設置DATEFIRST

+0

我不是downvote,但我認爲哪個downvote之前你編輯你的問題。 – RRUZ

+0

@RRUZ:事實上,downvote已不在那裏。 – mellamokb

+0

嗨@mellamokb,我對你發佈的這行代碼感興趣。我有一個場景,我可能不得不使用它,以便在一個腳本中我可能必須找到最近的星期四,或者在另一個星期一。我需要更改代碼中的哪些內容才能獲得這種靈活性?我是否只是將「+1」更改爲「+2」,以便選取最近的週四?你的代碼如何使星期五= 0? –

2

使用已知週五日期(我將使用2011年1月7日)爲出發點,你可以這樣做:

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

只需選擇一個已知週五,它比你的任何日期年長在你的計算中使用。

4

您可以檢查是否星期的當天是星期五或更大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 
+0

這取決於'@@ DATEFIRST'設置。如果我嘗試'SET DATEFIRST 2',它會返回'2011-05-06',對於'SET DATEFIRST 1',它會返回'2011-05-13' –

+0

@Martin,我同意你的意見,但OP很容易添加該變量進入SQL提議。 – RRUZ

0

這裏才達到一個完全地組面向方式的最後一個星期五:

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. 計算已知週五(1900年1月5日)之間的天數和指定的日期
  2. 將差值除以1得到的餘數將爲自上次星期五起經過的日期
  3. 從2.中減去餘數M中的給定日期的
+0

感謝您的解釋 – 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]