我想检查教授是否在该时间范围内安排了科目,或者是否在该时间范围内安排了房间。这是我的架构:
| subjectcode | prof_id | start | end | room |
+---------------------------------------------------------------------------+
| FREE ELEC 4 | 16-00002 | 2016-12-12T07:30:00 | 2016-12-12T10:30:00 | 1104 |
| TECHNO | 16-00001 | 2016-12-12T11:00:00 | 2016-12-12T14:00:00 | 1103 |
| FREE ELEC 4 | 16-00002 | 2016-12-13T08:00:00 | 2016-12-13T10:00:00 | 1104 |
| TECHNO | 16-00001 | 2016-12-13T10:30:00 | 2016-12-13T13:30:00 | 1103 |
| IT ELEC 5 | 16-00002 | 2016-12-13T15:30:00 | 2016-12-13T18:30:00 | 1106 |
| MMS | 16-00003 | 2016-12-15T08:00:00 | 2016-12-15T10:00:00 | 1107 |
+---------------------------------------------------------------------------+
我在下面有这个查询:
SELECT batchid, subjectcode, prof_id, DATE_FORMAT(start, '%Y-%m-%d %h:%i %p') AS start, DATE_FORMAT(end, '%Y-%m-%d %h:%i %p') AS end, room FROM schedules WHERE prof_id = "16-00002" OR room = "1103" OR start BETWEEN "2016-12-13T08:00:00" AND "2016-12-13T09:00:00" OR end BETWEEN "2016-12-13T08:00:00" AND "2016-12-13T09:00:00" OR "2016-12-13T08:00:00" BETWEEN start AND end
我会得到这样的结果:
| subjectcode | prof_id | start | end | room |
+---------------------------------------------------------------------------+
| FREE ELEC 4 | 16-00002 | 2016-12-12T07:30:00 | 2016-12-12T10:30:00 | 1104 |
| TECHNO | 16-00001 | 2016-12-12T11:00:00 | 2016-12-12T14:00:00 | 1103 |
| FREE ELEC 4 | 16-00002 | 2016-12-13T08:00:00 | 2016-12-13T10:00:00 | 1104 |
| TECHNO | 16-00001 | 2016-12-13T10:30:00 | 2016-12-13T13:30:00 | 1103 |
| IT ELEC 5 | 16-00002 | 2016-12-13T15:30:00 | 2016-12-13T18:30:00 | 1106 |
+---------------------------------------------------------------------------+
我希望得到的结果将与 2016-12-13T08:00:00
中的日期/时间范围相匹配至 2016-12-13T09:00:00
prof_id 为 16-00002 OR 房间为 1104:
| subjectcode | prof_id | start | end | room |
+---------------------------------------------------------------------------+
| FREE ELEC 4 | 16-00002 | 2016-12-13T08:00:00 | 2016-12-13T10:00:00 | 1104 |
+---------------------------------------------------------------------------+
最佳答案
说实话,我并不完全清楚您希望如何过滤您的 BETWEEN
条件,但主要问题是您对每个条件都使用 OR
.如果满足任何一个条件,则返回记录。如果您希望多个 条件为真以返回记录,则需要使用一些分组条件和AND
。看下面的内容...
SELECT
...
FROM schedules
WHERE
(prof_id = "16-00002" OR room = "1104")
AND
(start BETWEEN "2016-12-13T08:00:00" and "2016-12-13T09:00:00"
OR end BETWEEN "2016-12-13T08:00:00" and "2016-12-13T09:00:00"
OR "2016-12-13T08:00:00" BETWEEN start and end)
上面的查询将返回 A 和 B 都为真的所有结果:
A) Professor is 16-00002, OR the room is 1104
B) "start" is between 2016-12-13T08:00:00 and 2016-12-13T09:00:00,
OR "end" is between 2016-12-13T08:00:00 and 2016-12-13T09:00:00,
OR 2016-12-13T08:00:00 is between "start" and "end"
关于mysql - 检查教授和房间的时间表是否有冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41832727/