2011-10-12 3 views
0

날짜가 1&28 인 경우 매월 결과가 반환되지만, 둘 중 하나가 주말이면 금요일 (첫 번째 근무일 전)에 결과가 반환됩니다.SQL Server 2008 - 날짜 함수 및 수식

예 : 반환되는 다음 줄이 표에서

10 Oct 2010 Sunday 
28 Oct 2010 Thursday 

을 경우 나는대로 LineID 1를 반환 10 10 월 일요일이기 때문에, 그러므로 표에되지 않습니다, 그래서

LineId Date 
1  08 Oct 2010 
2  28 Oct 2010 

이 그 첫날 전에.

감사합니다.

+0

특정 날짜를 반환하거나 지금부터 2020 년 사이의 모든 작업 일수를 10 분의 28 초 이하로 반환해야합니까? –

답변

1

DATEPART(WEEKDAYDATEPART(DWDATEFIRST 설정에 따라 달라집니다. 잘못된 결과를 피하기 위해 @@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 일에 해당하는 휴일은 고려하지 않지만 쉽게 해결할 수 있습니다.