首页 > 解决方案 > 如何使用结果集作为输入从日历表中获取所有行

问题描述

我需要从结果集中找到两个日期之间的所有日期。
我的数据库有一个日历表,其中包含从几年前到足够远的未来的每个日期的一行。

现在我有这个查询

select convert(date, r.LaadDatum), 
       convert(date, r.LosDatum)
from   tblPlanning p
  inner join tblRit r on p.RitID = r.RitID 
where  r.ChauffeurID = 201
and    (convert(date, r.LaadDatum) >= '20180812' and convert(date, r.LaadDatum) <= '20180921')
and    datediff(day, r.LaadDatum, r.LosDatum) > 1

它返回这个结果集

COLUMN1     COLUMN2 
-------     ------- 
2018-08-14  2018-08-16  
2018-08-20  2018-08-22  
2018-09-01  2018-09-03  
2018-09-08  2018-09-10  
2018-09-14  2018-09-17  

使用此结果集作为输入,我需要以下结果:

2018-08-15  
2018-08-21  
2018-09-02  
2018-09-09  
2018-09-15  
2018-09-16  

换句话说,日历表中位于上述查询日期之间的所有行。日历表称为 tblCalendar。
如何才能做到这一点 ?
可能很简单,但由于某种原因,我只是看不到它

标签: sqlsql-serversql-server-2014

解决方案


看看这个。

DECLARE @myTable AS TABLE (Column1 DATE, Column2 DATE);

INSERT INTO @myTable (Column1, Column2)
VALUES ('2018-08-14', '2018-08-16')
,      ('2018-08-20', '2018-08-22')
,      ('2018-09-01', '2018-09-03')
,      ('2018-09-08', '2018-09-10')
,      ('2018-09-14', '2018-09-17');

WITH cte AS
    (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
       FROM master..spt_values)
SELECT          DATEADD(DAY,rn,Column1) DayToShow
  FROM          @myTable
 CROSS APPLY    cte
 WHERE DATEADD(DAY,rn,Column1) < column2

您应该会发现它比迭代 cte 方法更快,但是它仅限于大约 2,500 天的日期范围。如果需要,您可以在 cte 内交叉以提供更多行。


推荐阅读