mysql - 检查教授和房间的时间表是否有冲突

标签 mysql sql

我想检查教授是否在该时间范围内安排了科目,或者是否在该时间范围内安排了房间。这是我的架构:

| 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/

相关文章:

mysql - SQL中对2个聚合字段进行操作

php - 从 wordpress/woocommerce 搜索查询中获取不同的结果

mysql - 使用 MySQL 更新所有表中的外键

php - 如果 ID 存在于另一个表中,则拉行

mysql - 如何在使用 LOAD DATA INFILE 导入大数据文件时保持 MYSQL 性能?

mysql - 如何根据表中的特定条件选择表中的特定行?

mysql查找表加入其他3个表,有没有更好的方法?

javascript - 基于表单输入值,如何 2 生成选择 4 下拉菜单从数据库中行/记录数据,在选择时将预填充表单?

sql - s3中的查询头选择nodejs

c# - SQL 服务器错误 : ambiguous column name