【发布时间】:2018-06-05 16:11:29
【问题描述】:
我知道这可以在后端完成 - 但我想知道是否有任何本机或高效的 MySQL 函数可用于检查给定的 time 变量是否在两个 time 覆盖的范围内变量(start_time 和 end_time)。
我目前建立了一个数据库,如下所示;
+----+--------+------------+----------+
| id | job_id | start_time | end_time |
+----+--------+------------+----------+
| 1 | 40 | 13:00:00 | 14:00:00 |
| 2 | 44 | 14:45:00 | 15:00:00 |
| 3 | 45 | 15:10:00 | 15:30:00 |
+----+--------+------------+----------+
后端接受start_time 和end_time 和job_id - 然后它会查看它是否适合任何地方。例如,假设 start_time 为 13:30:00,end_time 为 13:45:00,后端应拒绝此作业请求,因为它没有可用的时间(它将与 id 1 的条目重叠。)
但是,如果提交的作业的 start_time 为 14:10:00,结束时间为 14:20:00,则应该接受 - 因为这不会与任何现有任务重叠。
以下查询可以很好地判断是否可以提交作业,例如 13:00:00 到 14:00:00(与 id 1 完全相同);
SELECT * WHERE start_time >= '13:00:00' AND end_time <= '14:00:00';
但是如果 start_time 变为 13:01:00,则查询失败 - 因为 start_time 小于 13:01:00,在 13:00:00。所以它会被批准插入,因为上面的查询不会返回重叠的结果。
如果我们将查询更改为 end_time 上的 OR 子句,那么实际上任何未在 14:00:00 之前结束的作业都会被拒绝。
谁能建议一种简单的方法来获取time 类型的输入变量,并检查它是否在所有可用的start_time 和end_time 变量的范围内,如上面的db 中所述?
【问题讨论】:
-
SELECT * WHERE start_time <= '14:00:00' AND end_time >= '13:00:00';- 但您可能需要<和>而不是<=和>=。 -
@lurker 是的,如果任何项目在开始之前就结束了,那么我们都有麻烦了。
-
@Strawberry 虽然“我昨天需要它”很常见。
-
为什么不用“BETWEEN”功能呢?
-
@slon 那不会很有用。
标签: mysql