2017-10-16 217 views
2

我怎样才能在下面的表获取SQL两个日期之间的日期列表

查询

select * from Vacation 

输出

EmpID VStart  VacEnd  VacType  PostDate 
362330 2017-10-15 2017-10-19 Sick Leave 2017-10-15 

列出两个日期之间的日期所需输出

EmpID Date  VacType  
362330 2017-10-15 Sick Leave 
362330 2017-10-16 Sick Leave 
362330 2017-10-17 Sick Leave 
362330 2017-10-18 Sick Leave 
362330 2017-10-19 Sick Leave 

我曾尝试使用下面的查询以获得所需的输出,但它没有工作,要做到这一点是创建一个数字表或使用子查询或CTE得到

DECLARE @Start DATETIME, @End DATETIME 
SELECT @Start='2017-10-15' , @End = '2017-10-19' 
;WITH DateList 
AS 
(
SELECT @Start [Date] 
UNION ALL 
SELECT [Date] +1 FROM DateList WHERE [Date] <@End 
) 
SELECT dbo.Vacation.EmpID,[Date], dbo.Vacation.VacType FROM dbo.Vacation INNER JOIN DateList ON DateList.Date = dbo.Vacation.VStart 
+1

为什么你已经在列中已经有了这些值的时候声明了“@ Start”和“@ End”? –

回答

1

最简单的方法一个数字列表,然后根据休假的开始和结束日期加入您的休假表。

例如,

DECLARE @Vacation TABLE (EmpID INT, VStart DATE, VacEnd DATE, VacType VARCHAR(255)); 
INSERT @Vacation (EmpID, VStart, VacEnd, VacType) VALUES 
(1, '2017-10-15', '2017-10-19', 'Sick Leave'), 
(2, '2017-10-15', '2017-10-16', 'Super Fun Happy Vacation'); 

SELECT Vacation.EmpID, 
     [Date] = DATEADD(DAY, T.N, Vacation.VStart), 
     Vacation.VacType 
FROM (
    SELECT N = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 
    FROM sys.objects 
) AS T 
JOIN @Vacation AS Vacation 
    ON DATEDIFF(DAY, Vacation.VStart, Vacation.VacEnd) >= T.N; 
0

我刚才所作变化不大,在查询中,我没有测试过,但似乎它会工作,请尝试。

DECLARE @Start DATETIME, @End DATETIME 
SELECT @Start='2017-10-15' , @End = '2017-10-19' 
;WITH DateList 
AS 
(
SELECT @Start AS [Date],@Start AS StartDate 
UNION ALL 
SELECT [Date] +1, @Start AS StartDate FROM DateList WHERE [Date] <@End 
) 
SELECT dbo.Vacation.EmpID,DateList.[Date], dbo.Vacation.VacType FROM dbo.Vacation INNER JOIN DateList ON DateList.StartDate = dbo.Vacation.VStart 
相关问题