2017-01-09 87 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);