2016-03-22 16 views
0

私はフォーマットSQL Serverの - テーブルから2つの日付の間の日付のリストを取得

Expected Result 

Date1 
------------- 
2016-03-26 
2016-04-07 
2016-04-08 
2016-04-09 

を以下に休日の一覧を取得する必要があります形式

TblHoliday  

StrDate  EndDate  Rmrks 
----------------------------------------- 
2016-03-26 2016-03-26 BankHoliday 
2016-04-07 2016-04-09 YearlyHolidays 

次の表を持っている私が使用しています次のクエリが、このクエリで2016-04-09を取得していません。

ActualResult 

Date1 
------------- 
2016-03-26 
2016-04-07 
2016-04-08 

現在のクエリは

;with cte as 
(
select T1.StrDate as [Date1] from TblHoliday T1 
union all 
select DATEADD(DD,1,T1.StrDate) as [Date1] from TblHoliday T1 where DATEADD(DD,1,T1.StrDate)<=T1.EndDate 
) 

select Date1 from cte 

は私が休日を日付範囲で定義されているこのクエリを使用して休日の日付のリストが必要です。

ありがとうございました。ここ

答えて

0
declare @TblHoliday table (StrDate date, EndDate date) 
insert @TblHoliday values ('2016-03-26', '2016-03-26'), ('2016-04-07', '2016-04-09') 

-- Build a tally table using date range from the data 
;with cte as 
(
    select min(StrDate) as value, max(EndDate) as maxvalue from @TblHoliday 
    union all select dateadd(day, 1, value), maxvalue from cte where dateadd(day, 1, value) <= maxvalue 
) 
select value from cte 
-- filter out the dates 
where exists(select * from @TblHoliday where value between StrDate and EndDate) 
option(maxrecursion 0) 
を使用して解決します
0

Tally Table.

WITH E1(N) AS(
    SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N) 
), 
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), 
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), 
CteTally(N) AS(
    SELECT TOP(SELECT MAX(DATEDIFF(DAY, StrDate, EndDate)) + 1 FROM TblHoliday) 
     ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
    FROM E4 
) 
SELECT 
    dt = DATEADD(DAY, t.N- 1, h.StrDate) 
FROM TblHoliday h 
INNER JOIN CteTally t 
    ON DATEADD(DAY, t.N- 1, h.StrDate) <= h.EndDate 
関連する問題