我不知道如何解决我遇到的这个问题。这就是我想要做的事情:
我有一张包含日历的表格,所以每年的每一天(yyyy-mm-dd)。
我有另一张表格,其中包含我们设备所使用的所有日期。此表格填写自我网站的其他部分,但格式相同(yyyy-mm-dd)。
我有第三个表,其中包含我们的调度系统中的所有事件。通过这个系统,我们的员工可以预订我们的设备等等。
所以我要做的就是在日历中找到所有不在某个单位工作的日子:
select *
from Calendar
where PKDate not in (select DayWorked
from DaysWorked
where Unit='105')
但我还需要考虑设备的休息日。我不想将这些日子包含在我的结果集中。这是事件(休假日程)时间表的架构:
ID | Name | EventStart | EventEnd | UnitID
1 Days Off 2015-2-10 2015-2-15 105
2 Days Off 2015-3-2 2015-3-10 105
所有日期列都是DateTime
我不完全是如何在SQL查询中的NOT IN子句中使用EventStart
和EvetnEnd
列的。我正在使用SQL Server 2012.有什么想法吗?
答案 0 :(得分:3)
我会使用LEFT JOIN来排除表格之外的所有间隔:
SELECT Calendar.*
FROM
Calendar LEFT JOIN DaysOff
ON Calendar.PKDate BETWEEN DaysOff.EventStart AND DaysOff.EventEnd
AND UnitID='105'
WHERE
DaysOFf.ID IS NULL
AND PKDate NOT IN (SELECT DayWorked
FROM DaysWorked
WHERE Unit='105')
答案 1 :(得分:1)
NOT EXISTS
是我想到的:
select c.*
from calendar c
where not exists (select 1
from DaysWorked
where Unit = '105' and c.PKDate = d.DayWorked
) and
not exists (select 1
from DaysOff d
where Unit = '105' and
c.PKDate >= d.eventstart and c.PKDate <= d.eventend
);
注意:如果存储在表中的日期可能有时间组件,则您需要调整查询以将此考虑在内。如果他们没有时间组件,您应该使用date
而不是datetime
。