【问题标题】:Checking if a time falls within a time range in MySQL [duplicate]检查时间是否在MySQL的时间范围内[重复]
【发布时间】:2018-06-05 16:11:29
【问题描述】:

我知道这可以在后端完成 - 但我想知道是否有任何本机或高效的 MySQL 函数可用于检查给定的 time 变量是否在两个 time 覆盖的范围内变量(start_timeend_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_timeend_timejob_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_timeend_time 变量的范围内,如上面的db 中所述?

【问题讨论】:

  • SELECT * WHERE start_time &lt;= '14:00:00' AND end_time &gt;= '13:00:00'; - 但您可能需要&lt;&gt; 而不是&lt;=&gt;=
  • @lurker 是的,如果任何项目在开始之前就结束了,那么我们都有麻烦了。
  • @Strawberry 虽然“我昨天需要它”很常见。
  • 为什么不用“BETWEEN”功能呢?
  • @slon 那不会很有用。

标签: mysql


【解决方案1】:

我建议您通过以下方式之一签到:小时/分钟/秒

SELECT *  FROM timetableTemp 
WHERE HOUR(TIMEDIFF(start_time, end_time))>=1 
AND start_time >=start_time

或使用 BETWEEN 函数

SELECT *  FROM timetableTemp 
WHERE '13:00:00' BETWEEN start_time AND end_time

支持:

SELECT SECOND(TIMEDIFF("13:10:11", "13:10:10")) AS Seconds; -- 1
SELECT MINUTE(TIMEDIFF("13:10:11", "13:10:10")) AS Minutes; -- 0
SELECT HOUR(TIMEDIFF("13:00:00", "14:00:00")) AS Hours; -- 1

【讨论】:

    【解决方案2】:

    假设您有一份以new_start 开头和new_end 结尾的新工作。假设您现有的列表按每个工作条目的时间顺序排列,并且它们都是不重叠的。

    您需要检查新工作是否适合列表且没有重叠:

    • new_end 小于第一个列表条目的 start_time,在 在这种情况下,新条目适合在开头,或者
    • new_start 是 大于最后一个列表条目的end_time,在这种情况下 新条目适合最后,或者
    • 对于一些中间列表条目, new_start 大于 end_time 并且 new_end 小于 以下列表条目的start_time,在这种情况下,新的 条目介于此条目和下一个条目之间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 2018-04-07
      • 2021-05-09
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多