不在之间的SQL日期(select语句)

时间:2015-04-10 14:41:39

标签: sql sql-server stored-procedures

我不知道如何解决我遇到的这个问题。这就是我想要做的事情:

我有一张包含日历的表格,所以每年的每一天(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子句中使用EventStartEvetnEnd列的。我正在使用SQL Server 2012.有什么想法吗?

2 个答案:

答案 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