我有一张桌子,里面有员工Ids&轮班日期。
我正在构建一个报告,我想生成未分配的班次是指表中没有的日期。
示例: - 用户选择日期范围 - 1月1日 - 1月31日 - 所有员工。因此,表中不存在的日期将在报告中生成。
我可以通过检索所有记录轻松地在Linq中执行此操作,然后迭代每个员工&找到不存在的日期&在Datatable中获取它,这就是我迄今为止所尝试过的。
我可以通过触发单个SQL查询来实现吗?
答案 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)