首页 > 解决方案 > 即使不在使用 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

标签: sqlsql-serverdatestored-proceduresrecursive-query

解决方案


您可以使用递归查询来生成日期,然后使用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)在查询的最后添加。


推荐阅读