假设我有下表
+----------+------------+-----------+----------+
| 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 |
+----------+------------+-----------+----------+
对于一个特殊的例子,我手头没有任何可用的老师,但我需要选择那些上课时间不属于某个给定时间的老师。例如。一个新的班级(班级id=47)已经宣布,时间为 15:00:00
至 17: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'
1条答案
按热度按时间mznpcxlj1#
这只是重叠范围的问题。您可以使用以下逻辑:
演示
我使用的逻辑是从mysql中日期范围的规范问题检查重叠中借用的
要查找与新传入的开始和结束时间重叠的记录,我们将使用:
但是,在您的例子中,您希望范围具有零重叠,即与上述相反。根据德莫根定律,上述逻辑变成: