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

时间:2017-01-09 10:19:33

标签: mysql

我正在使用MySQL 5.6

我有一个表shift,其中列start_time(TIME)和end_time(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时),此查询应该有效。任何人都可以帮我解决夜班问题。

3 个答案:

答案 0 :(得分:0)

问题是MySQL假设两个TIME都在同一天。因此,当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

答案 1 :(得分:0)

尝试此查询..

mysql> SELECT * FROM shift
      `WHERE end_time > CAST(now() - interval 15 minute AS time)
       and end_time < `CAST(now() as time);

答案 2 :(得分:-1)

一旦尝试这种方式

select * from aa_shift where

TIMESTAMPDIFF(MINUTE,start_time,end_time) < 15

or

TIMEDIFF(start_time,end_time) < 15