繁体   English   中英

mysql选择不属于给定间隔的时间间隔

[英]mysql select time interval that does not fall under a given interval

假设我有下表

+----------+------------+-----------+----------+
| class_id | teacher_id | starts_at | ends_at  |
+----------+------------+-----------+----------+
|       39 |          5 | 15:00:00  | 21:00:00 |
|       40 |         20 | 18:00:00  | 21:00:00 |
|       41 |         59 | 18:00:00  | 21:00:00 |
|       42 |         21 | 18:30:00  | 20:00:00 |
|       43 |         80 | 18:30:00  | 21:00:00 |
|       44 |       NULL | 17:30:00  | 21:00:00 |
|       45 |        140 | 17:30:00  | 20:00:00 |
|       46 |        123 | 18:30:00  | 21:00:00 |
+----------+------------+-----------+----------+

在特定情况下,我手边没有老师,但我需要选择那些上课时间不超过特定时间的老师。 例如。 已经宣布了新课程(class_id = 47),课程时间为15:00:0017:30:00 现在,我要选择teacher_id ,其现有的上课时间不属于此时间范围。 我应该如何编写此查询?

试过这个,但我错了:

SELECT * from classes 
where time(starts_at) not between '15:00:00' and '17:30:00' 
and time(ends_at) not between '15:00:00' and '17:30:00'

这只是重叠范围的问题。 您可以使用以下逻辑:

SELECT *
FROM classes 
WHERE '15:00:00' >= ends_at OR '17:30:00' <= starts_at;

在此处输入图片说明

演示版

我使用的逻辑是从标准问题中借用的: 检查MySQL中日期范围的重叠

要查找与新的传入开始和结束时间重叠的记录,我们将使用:

WHERE new_start < existing_end AND new_end > existing_start;

但是,在您的情况下,您希望范围具有零重叠,即与上面的相反。 根据德摩根定律,以上逻辑将变为:

WHERE new_start >= existing_end AND new_end <= existing_start;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM