sql获取在特定日期和时间未预订的所有可用人员

时间:2017-03-18 22:25:33

标签: mysql sql sql-server

我正在努力解决SQL查询问题。 我正在为滑雪胜地建立一个预订系统,在我的数据库中我有导师和会议。会话可以有一个教师,它有一个日期和startTime和endTime。 为了添加会话,我希望在选定的时间和日期获得所有可用的教师。换句话说,所有在那个日期和那个时间都没有预订的教师。 表示例:

e.g 教练:i1,i2,i3,i4,i5,i6,i7,i8

会议:

讲师|日期|开始|结束|

**i1**          **2017-05-03**        **14:30:00**      **15:30:00**
**i2**          **2017-05-03**        **14:30:00**      **15:30:00**
**i3**          **2017-10-03**        **10:30:00**      **11:30:00**
**i4**          **2017-05-03**        **10:30:00**      **11:30:00**
**i1**          **2017-11-03**        **14:30:00**      **15:30:00**

然后输入日期=' 2017-05-03'并开始=' 14:30'并且结束=' 15' 30'我想要

I3,I4,I5,I6,I7,I8

想出我需要将加入会话留给教师,按教师ID分组,然后消除那些在选定组中有字段的ID 投入。但是,对于GROUP BY子句,我必须使用聚合函数,我不知道哪一个可以在这里应用。

3 个答案:

答案 0 :(得分:0)

使用not exists()

select *
from instructors i
where not exists (
  select 1
  from sessions s
  where s.instructor = i.id
    and s.date  = '2017-05-03'
    and s.start = '14:30'
    and s.end   = '15:30'
    )

答案 1 :(得分:0)

所以我尝试了这个查询,显然它起作用(至少对我的测试用例而言)

任何人都可以看看并告诉我它看起来是否正确?

select * 
from instructor
where id in
(select id
from instructor 
group by id
having id not in 
(select distinct(instructorid) from Session
where date='2017-03-19' and starttime<='15:30:00' and endtime>='14:30:00') )

答案 2 :(得分:0)

SirWinning的自我回答看起来应该可行,但我的版本会删除一些不需要的部分。

select * 
from instructor
where id not in 
  (select instructorid
   from Session
   where date='2017-03-19' and starttime<='15:30:00' and endtime>='14:30:00')

此代码将找到任何未在相关日期与14:30-15:30窗口重叠的会话预订的教师。

如果这是他们想要的,那么你很高兴。当然,并不是说导师是真的可用&#34;。可能存在影响其可用性的其他因素(工作时间,年假等),因此您需要确保有适当的事情来处理这些事情。

另请注意,此代码会阻止教师出现&#34;背靠背&#34;预订。如果您希望在另一个结束时允许预订从14:30开始,则您需要将<=>=更改为<和{{ 1}}。