sql - 即使不在使用 SQL Server 存储过程的数据库上,如何显示该月的缺失天数
问题描述
我需要显示一个显示该月所有日期的报告。假设从 2020 年 1 月 1 日到 2020 年 1 月 31 日。为此,我创建了一个具有开始日期和最后日期的存储过程,并将 Left Join 与表一起使用
我写
DECLARE @FromDate DATE = '2020-01-01';
DECLARE @FromDate DATE = '2020-01-31';
SELECT a1.f1, a1.f2, b.f3. b.f5
FROM table1
LEFT JOIN table2 AS b ON b.f1 = a.f1
AND (@FromDate IS NULL OR a.Date >= @FromDate)
AND (@ToDate IS NULL OR a.Date <= @ToDate)
结果,因为没有缺失日期的记录,例如 2020-01-02,如下所示
2020-01-01 f1 f2
2020-01-04 f1 f2
我需要显示所有日期,所以结果将是
2020-01-01 f1 f2
2020-01-02 f1 f2
2020-01-03 null null
2020-01-04 f1 f2
2020-01-05 null null
.
.
2020-01-31 null null
我使用 Microsoft SQL Server
解决方案
您可以使用递归查询来生成日期,然后使用left join
.
with recursive all_dates as (
select @FromDate dt
union all
select dateadd(day, 1, dt) from all_dates where dt < @ToDate
)
select d.dt, t.f1, t.f2
from all_dates d
left join table1 on t.date = d.date
我看不到table2
有什么用,因为您的查询table1
仅返回来自的列,所以我从查询中删除了 if 。
如果您需要生成超过 100 天的时间段,那么您可能需要option (maxrecursion 0)
在查询的最后添加。
推荐阅读
- r - R中的manova()与主题因素之间和内部
- python - 镶木地板文件格式是否必须始终保存模式(带有数据类型)和标头?
- java - 在使用带有模式匹配的 appendReplacement 之前清理输入
- wordpress - 在 taxonomy1 模板中计算 taxonomy2 的帖子数
- javascript - 你能“连接”两个页面,使一个页面上的操作影响另一个页面吗?
- java - 使用 Firebase for Android 时出现片段错误
- python - Django - 在views.py内部使用我自己的REST API的正确方法?
- asp.net-core - SharpApp 和 Office JS API
- java - 如何获取 SPARQL-DL 查询中使用的所有实体?
- python-3.7 - python条件格式替换