2017-01-09 59 views
0

我使用的MySQL 5.6MySQL的TIMEDIFF

我有一个表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)。任何人都可以帮我解决夜班的问题。

+0

你没有主键。这将会非常棘手以至于无法解决。 – Strawberry

+0

@Strawberry请随意假设一个以'id'作为主键的列,就像我在真实应用程序中一样。让我知道是否应该在这里添加它以清楚。 – Jigar

+0

当然你应该! – Strawberry

回答

-1

一旦尝试这种方式

select * from aa_shift where 

TIMESTAMPDIFF(MINUTE,start_time,end_time) < 15 

or 

TIMEDIFF(start_time,end_time) < 15 
+0

这是否适用于23:55的结束时间? – Strawberry

+1

[TIMEDIFF]( https://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_timediff)只接受两个参数 – Jigar

+0

hmm TimeDiff不会工作..可能是你应该使用timestampdiff和检查end_time>开始时间,我认为你需要写一些光标 –

0

的问题是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 
0

尝试此查询..

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