sql - 如何使用结果集作为输入从日历表中获取所有行
问题描述
我需要从结果集中找到两个日期之间的所有日期。
我的数据库有一个日历表,其中包含从几年前到足够远的未来的每个日期的一行。
现在我有这个查询
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。
如何才能做到这一点 ?
可能很简单,但由于某种原因,我只是看不到它
解决方案
看看这个。
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 内交叉以提供更多行。
推荐阅读
- kotlin - 在 REPL 中运行时,Kotlin forEach 有时直到 CTL-C 才会执行?
- r - 如何在R中的多行中添加不同的点?
- python - Python Pandas - 查找丢失的行,然后通过修改复制另一行
- python - 为什么长度减法返回错误?
- javascript - JS在新函数调用之前清除上一个函数调用的计时器
- testing - IntelliJ 的命令调度
- ruby-on-rails - CORS 在不同端口上的 React 前端无法在 Rails 6 上运行
- python - 正则表达式以分号和逗号分隔,但在某些情况下除外
- python - 中间模型未显示在管理控制台中?
- sql - MariaDB语句中如何替换UNION子句的思考