假设我有下表
+----------+------------+-----------+----------+
| 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: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'
答案 0 :(得分:2)
这只是重叠范围问题。您可以使用以下逻辑:
SELECT *
FROM classes
WHERE '15:00:00' >= ends_at OR '17:30:00' <= starts_at;
我使用的逻辑是从规范问题Check overlap of date ranges in MySQL借来的
要查找与新的传入开始和结束时间重叠的记录,我们将使用:
WHERE new_start < existing_end AND new_end > existing_start;
但是,在您的情况下,您希望重叠的范围为零,即与上述情况相反。根据德摩根定律,以上逻辑变为:
WHERE new_start >= existing_end AND new_end <= existing_start;