2013-06-04 2 views
3

두 날짜 (startDate 및 endDate) 사이의 날짜 목록을 선택하고 싶습니다. 여기서 날짜는 별도의 목록 (휴일)으로 표시되지 않습니다.날짜가 목록에없는 두 날짜의 차이 선택

는 예를 들어 내가 사용하고 있습니다 : 나에게 두 날짜 사이의 날짜의 목록을 제공

select dateadd(day, number, StartDate) 
from 
    (select distinct number from master.dbo.spt_values 
     where name is null 
    ) n 
where dateadd(day, number, StartDate) < EndDate 

합니다. 그러나 나는 휴일 날짜의 목록에없는 곳을 데리고 나가고 싶습니다.

감사합니다,

Firstcape

답변

2

이 하나 개의 시도 -

쿼리 1 :

DECLARE 
     @DateFrom DATETIME 
    , @DateTo DATETIME 

SELECT 
     @DateFrom = '20130101' 
    , @DateTo = '20130131' 

DECLARE @holidays TABLE ([Date] DATETIME) 
INSERT INTO @holidays ([Date]) 
VALUES ('20130101') 

SELECT [Date] 
FROM (
    SELECT [Date] = DATEADD(DAY, sv.number, t.DateFrom) 
    FROM (
     SELECT 
       DateFrom = @DateFrom 
      , diff = DATEDIFF(DAY, @DateFrom, @DateTo) 
    ) t 
    JOIN [master].dbo.spt_values sv ON sv.number <= diff 
    WHERE sv.[type] = 'p' 
) t2 
WHERE t2.[Date] NOT IN (SELECT h.[Date] FROM @holidays h) 

질의 2 :

SELECT t2.[Date] 
FROM (
    SELECT [Date] = DATEADD(DAY, sv.number, t.DateFrom) 
    FROM (
     SELECT 
       DateFrom = @DateFrom 
      , diff = DATEDIFF(DAY, @DateFrom, @DateTo) 
    ) t 
    JOIN [master].dbo.spt_values sv ON sv.number <= diff 
    WHERE sv.[type] = 'p' 
) t2 
LEFT JOIN @holidays h ON h.[Date] = t2.[Date] 
WHERE h.[Date] IS NULL 

출력 :

Date 
----------------------- 
2013-01-02 00:00:00.000 
2013-01-03 00:00:00.000 
2013-01-04 00:00:00.000 
2013-01-05 00:00:00.000 
2013-01-06 00:00:00.000 
2013-01-07 00:00:00.000 
2013-01-08 00:00:00.000 
... 
+0

이 설정된 날짜에 대해 작동합니다 감사합니다,하지만 난 다른 시작 및 종료 날짜와 여러 구성원이 작업을 수행해야합니까? ID 및 시작일 및 종료일 목록이있는 별도의 쿼리 등. – FirstCape

+0

시작일과 종료일을 데이터로 입력하십시오. – Devart

+0

죄송합니다. 마지막 코멘트를 무시하십시오. 내가 필요한 몇 가지 추가 데이터를 혼동했다. 당신의 도움을 주셔서 감사합니다! – FirstCape