SQL Server 2008 - 日期函数和公式

问题描述:

我想返回结果,如果日期落在每个月的月份上,但是如果周末是周五(第一个工作日之前),则返回结果。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年之间返回所有工作日

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 

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

我真的很喜欢用这样的查询来使用日历表。

-- 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日落下的假期,但这很容易解决。