2011-01-24 112 views
4

timediff函數無法按預期工作。在下面的例子中,我試圖計算1年期間的差值。timediff的意外結果

mysql>SELECT 366*24*60*60 AS expected; 
+----------+ 
| expected | 
+----------+ 
| 31622400 | 
+----------+ 
1 row in set (0.00 sec) 

mysql>SELECT ABS(UNIX_TIMESTAMP('2000:01:01 00:00:00') - UNIX_TIMESTAMP('2001:01:01 00:00:00')); 
+------------------------------------------------------------------------------------+ 
| ABS(UNIX_TIMESTAMP('2000:01:01 00:00:00') - UNIX_TIMESTAMP('2001:01:01 00:00:00')) | 
+------------------------------------------------------------------------------------+ 
|                   31622400 | 
+------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql>SELECT TIME_TO_SEC(TIMEDIFF('2000:01:01 00:00:00', '2001:01:01 00:00:00')); 
+---------------------------------------------------------------------+ 
| TIME_TO_SEC(TIMEDIFF('2000:01:01 00:00:00', '2001:01:01 00:00:00')) | 
+---------------------------------------------------------------------+ 
|               -3020399 | 
+---------------------------------------------------------------------+ 
1 row in set, 1 warning (0.00 sec) 

Warning (Code 1292): Truncated incorrect time value: '-8784:00:00' 

回答

5

編輯:您正在使用什麼版本的MySQL?至少在5.0.22上它工作正常。我剛剛運行了這個查詢。看到這裏

mysql> SELECT TIME_TO_SEC(TIMEDIFF('2000:01:01 00:00:00', '2001:01:01 00:00:00')); 
+---------------------------------------------------------------------+ 
| TIME_TO_SEC(TIMEDIFF('2000:01:01 00:00:00', '2001:01:01 00:00:00')) | 
+---------------------------------------------------------------------+ 
|               -31622400 | 
+---------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

您是否see here?它可能是截斷問題,因爲時間範圍遠小於您的日期差異。


原來的答案

使用此

SELECT TIMESTAMPDIFF(SECOND,'2000:01:01 00:00:00', '2001:01:01 00:00:00'); 
    +--------------------------------------------------------------------+ 
    | TIMESTAMPDIFF(SECOND,'2000:01:01 00:00:00', '2001:01:01 00:00:00') | 
    +--------------------------------------------------------------------+ 
    |               31622400 | 
    +--------------------------------------------------------------------+ 

的問題是你要負時間轉換成時間在秒。交換變量將完成這項工作。

SELECT TIME_TO_SEC(TIMEDIFF('2001:01:01 00:00:00','2000:01:01 00:00:00')); 
    +--------------------------------------------------------------------+ 
    | TIME_TO_SEC(TIMEDIFF('2001:01:01 00:00:00','2000:01:01 00:00:00')) | 
    +--------------------------------------------------------------------+ 
    |               31622400 | 
    +--------------------------------------------------------------------+ 
+1

我有類似的問題。 TIMESTAMPDIFF而不是TIMEDIFF解決了我的問題! – Selah 2015-01-27 18:57:12