我需要从结果集中找到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。
该怎么办?
可能非常简单,但出于某种原因我只是看不到
答案 0 :(得分:1)
答案 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