2011-01-24 7 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