从选择语句中查找重叠时间

时间:2019-06-03 23:34:23

标签: php mysql

好的,所以我在数据库(日历)中有一个表(时间表),如果格式化的话,如下所示:

+----+--------+-----------+-----------+---------+
| id |  name  |    day    | startTime | endTime |
+----+--------+-----------+-----------+---------+
|  1 | George | Sunday    | 12:00     | 14:00   |
| 2  | Dan    | Monday    | 13:30     | 15:30   |
|  3 | Jeff   | Wednesday | 12:00     | 14:00   |
|  4 | Bill   | Monday    | 13:45     | 15:45   |
+----+--------+-----------+-----------+---------+

然后我有一些如下的PHP:

  <?php
 $sql = "SELECT * FROM timetable WHERE id IN (1, 2, 3, 4)"
    $result = $con->query($sql);
     while ($row = mysqli_fetch_assoc($result)) {
         $array2[] = $row;
    }    

  echo json_encode($array2, JSON_PRETTY_PRINT);

  ?>

然后将整个表输出为JSON格式的关联数组。

我希望它仅输出发生冲突的两个。由于输入法的原因,数据库中的冲突永远不会超过两个,因此只需要检查是否存在一个冲突,并为两行输出JSON。

我不确定从哪里开始。最好是通过PHP以编程方式进行此操作,还是可以使用mysql处理?我在想这是否以编程方式完成,也许是两个嵌套的for循环,以及语句是否大于或小于时间字段?但是似乎很混乱,我在想可能有一个我想不到的更聪明的最终优雅解决方案。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用 SQL 中的 JOIN 进行操作,如下所示:-

要查找“任何重叠”,可以将时间范围的两端进行比较。

SELECT * FROM timetable a
JOIN timetable b 
    on a.starttime <= b.endtime
    and a.endtime >= b.starttime
    and a.name != b.name;