2011-10-12 98 views
0

我想返回結果,如果日期落在每個月的月份上,但是如果週末是週五(第一個工作日之前),則返回結果。SQL Server 2008 - 日期函數和公式

例如,如果要返回下面的行

10 Oct 2010 Sunday 
28 Oct 2010 Thursday 

在表中我有

LineId Date 
1  08 Oct 2010 
2  28 Oct 2010 

如此,因爲10月10日是星期日,因此不會在餐桌上,它會返回LineID 1爲這是第一個工作日之前。

謝謝。

+0

是否要求返回特定日期,或是要求從現在到2020年之間返回所有工作日<=第10次和<=第28次? –

回答

1

DATEPART(WEEKDAYDATEPART(DW依賴於DATEFIRST設置。爲避免不正確的結果,可以使用@@DATEFIRST函數。

WITH T(D) AS 
(
SELECT CAST('20111008' AS DATE) UNION ALL 
SELECT CAST('20111009' AS DATE) UNION ALL 
SELECT CAST('20111010' AS DATE) UNION ALL 
SELECT CAST('20111011' AS DATE) UNION ALL 
SELECT CAST('20111012' AS DATE) UNION ALL 
SELECT CAST('20111013' AS DATE) UNION ALL 
SELECT CAST('20111014' AS DATE) 
) 
SELECT CASE 
     WHEN (@@DATEFIRST + DATEPART(WEEKDAY, D)) % 7 > 1 THEN D 
     ELSE DATEADD(DAY, -(1 + (@@DATEFIRST + DATEPART(WEEKDAY, D)) % 7), D) 
     END AS WeekDayOrPrecedingFriday 
FROM T 
0
Select Case 
     When DatePart(dw,SampleData.[Date]) = 1 Then DateAdd(d,-2,SampleData.[Date]) 
     When DatePart(dw,SampleData.[Date]) = 7 Then DateAdd(d,-1,SampleData.[Date]) 
     Else SampleData.[Date] 
     End 
From (
     Select Cast('2010-10-10' As datetime) As [Date] 
     Union All Select '2010-10-28' As [Date] 
     ) As SampleData 

您可能會發現更容易有一個日曆表的一行你需要一個指明某一天是否是「工作」一天的所有日子。通過這種方式,您可以輕鬆地計算假期和假期的實際休息日(例如,如果7月4日在美國,則在週六,將前一個星期五標記爲休息日)。

如果你實在擔心處理DateFirst,只是之前將其設置爲運行查詢:

Set DateFirst 7; 

以上是美國的默認設置這是星期日是一週的第一天。

+0

'DatePart(dw'依賴於'@@ datefirst' –

+0

@Martin Smith - 我承認美國的默認值,如果沒有使用這個默認值,顯然上面的算法需要修改。 – Thomas

0

我真的很喜歡用這樣的查詢來使用日曆表。

-- For convenience, I'll use a view. The view "weekdays" is a proper 
-- subset of the table "calendar". 
create view weekdays as 
select * from calendar 
where day_of_week in ('Mon', 'Tue', 'Wed', 'Thu', 'Fri'); 

這樣做後,查詢不僅是簡單的,它可以很容易地被看作是正確的。

select max(cal_date) 
from weekdays 
where cal_date <= '2010-10-10' -- Returns 2011-10-08 

不計算可能在10日或28日落下的假期,但這很容易解決。