仅两个 TIME 之间的 MySQL TIMEDIFF(不是 DATETIME)

标签 mysql

我正在使用 MySQL 5.6

我有一张 table shift带列 start_time (时间)和 end_time (时间):

+------------+----------+
| start_time | end_time |
+------------+----------+
| 07:00:00   | 16:00:00 |
| 15:00:00   | 23:00:00 |
| 22:00:00   | 07:00:00 |
| 12:00:00   | 21:00:00 |
| 12:00:00   | 09:00:00 |
| 10:00:00   | 20:00:00 |
| 23:00:00   | 01:00:00 |
| 21:00:00   | 05:00:00 |
+------------+----------+

我想找到将在接下来的 15 分钟内结束的所有类次。以上是样本数据,顺便说一句,它也可以有分钟。

这是我试过的:

SELECT start_time, end_time FROM shift WHERE TIME_TO_SEC(TIMEDIFF(end_time, TIME(NOW()))) < 900;

结果:

+------------+----------+
| start_time | end_time |
+------------+----------+
| 22:00:00   | 07:00:00 |
| 12:00:00   | 09:00:00 |
| 23:00:00   | 01:00:00 |
| 21:00:00   | 05:00:00 |
+------------+----------+

当我的表中没有任何夜类时(即当 start_time 大于 end_time 时),此查询应该有效。谁能帮我解决夜类的问题。

最佳答案

问题是 MySQL 假定两个时间都在同一天。所以当 end_time 时你会得到负面结果是过去,这将触发你的 < 900条件,给你太多的结果。

我看到有两种方法可以解决这个问题:

1:扩展条件去除负结果

SELECT start_time, end_time
FROM foo
WHERE TIME_TO_SEC(TIMEDIFF(end_time, TIME(NOW()))) > 0
AND   TIME_TO_SEC(TIMEDIFF(end_time, TIME(NOW()))) < 900

2:更短的方法,将所有负值加上 24 小时。通常 MOD() 函数可以解决问题,但不知何故它在 MySQL 中无法做到这一点,因此您还需要将 24 小时添加到您的值中:

SELECT start_time, end_time
FROM foo
WHERE MOD(TIME_TO_SEC(TIMEDIFF(end_time, TIME(NOW()))) + 24*60*60, 24*60*60) < 900

关于仅两个 TIME 之间的 MySQL TIMEDIFF(不是 DATETIME),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41545693/

相关文章:

java - SQLite 'INSERT OR REPLACE INTO' 不正确的行为

sql - 如何在MySQL的结果集中选择具有唯一字段的所有行,并获取该行中的所有字段?

java - 无法在 Java 中连接到 MySQL 数据库

MySQL索引帮助——哪个更快?

MySQL 语法 : bigger than value, 但不在 (...)

mysql - customer_id '在where子句中不是明确的?

mysql source 命令给出错误 2 和错误 17?

mysql - 根据另一个表中的记录更新 SQL 记录

MYSQL查询统计表行数

mysql - 如何在考虑到 SQL 中的另一列的情况下选择列中的下一个可用值?