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

관련 문제