如何使用结果集作为输入从日历表中获取所有行

时间:2019-01-22 15:48:25

标签: sql sql-server sql-server-2014

我需要从结果集中找到2个日期之间的所有日期。
我的数据库有一个日历表,该表在几年前的每个日期中保留一行,直到将来为止。

现在我有这个查询

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。
该怎么办?
可能非常简单,但出于某种原因我只是看不到

3 个答案:

答案 0 :(得分:1)

您可以尝试通过MyHubConnection.off('Broadcast');函数使用cte递归。

DATEADD

sqlfiddle

答案 1 :(得分:1)

看看这个。

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方法更快的方法,但是它仅限于大约2500天的日期范围。如果需要,您可以在cte内部交叉添加更多行。

答案 2 :(得分:0)

我会在这里使用光标。就像每个人一样。 请尝试此代码。输出为@TempTable,其中包含日期之间的所有内容

Declare @TempTable table (BetweenDate datetime)
Declare @FromDate datetime, 
        @ToDate datetime,
        @date datetime

Declare DatesCursor Cursor For
        Select FromDate, ToDate From (
                     select convert(date, r.LaadDatum) FromDate, 
                            convert(date, r.LosDatum) ToDate 
                     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) t


    Open DatesCursor
    Fetch Next From DatesCursor Into @FromDate,  @ToDate

    While @@Fetch_Status = 0
    Begin
        If (@FromDate is not null and @ToDate is not null )
            Begin
                SET @date = DATEADD(day, 1, @FromDate) 
                WHILE (@date < @ToDate)
                BEGIN
                    insert @TempTable Values(@date)
                    SET @date = DATEADD(day, 1, @date) 
                END
        END
        Fetch Next From DatesCursor Into @FromDate,  @ToDate
    End

    Close DatesCursor

    select * from @TempTable