SQL查询查找表中不存在的日期

时间:2018-01-22 05:21:49

标签: c# sql-server linq

我有一张桌子,里面有员工Ids&轮班日期。

我正在构建一个报告,我想生成未分配的班次是指表中没有的日期。

示例: - 用户选择日期范围 - 1月1日 - 1月31日 - 所有员工。因此,表中不存在的日期将在报告中生成。

我可以通过检索所有记录轻松地在Linq中执行此操作,然后迭代每个员工&找到不存在的日期&在Datatable中获取它,这就是我迄今为止所尝试过的。

我可以通过触发单个SQL查询来实现吗?

1 个答案:

答案 0 :(得分:1)

您需要一个日历表来执行此操作。

我使用了Recursive CTE来生成日期。但我建议在数据库中创建一个日历表,并在像这样的查询中使用它

DECLARE @startdate DATE = '2018-01-01',
        @enddate   DATE = '2018-01-31';

WITH calendar
     AS (SELECT @startdate AS Dates
         UNION ALL
         SELECT Dateadd(dd, 1, Dates)
         FROM   calendar
         WHERE  Dates < @enddate)
SELECT *
FROM   calendar c
       CROSS JOIN (SELECT DISTINCT EmployeeId
                   FROM   Employees) E --replace with your employee table name
WHERE  NOT EXISTS (SELECT 1
                   FROM   yourtable t
                   WHERE  c.Dates = t.dates
                          AND E.EmployeeId = t.EmployeeId)
OPTION (maxrecursion 0)