2013-12-12 74 views
1

我已經使用phpmyadmin(工作正常)爲mysql創建了一個函數。它以天,小時,分鐘和秒計算兩個日期之間的差異。輸出可以是一個這樣的:MySQL函數達到了時間差計算的極限

5D 16H24米56S

所提到的功能:

CREATE FUNCTION time_full(A DATETIME, B DATETIME) RETURNS VARCHAR(30) 
BEGIN 

RETURN CONCAT(FLOOR(HOUR(TIMEDIFF(A,B))/24),'d ' 
       ,MOD(HOUR(TIMEDIFF(A,B)),24), 'h ' 
       ,MINUTE(TIMEDIFF(A,B)),'m ' 
       ,SECOND(TIMEDIFF(A, B)),'s'); 

END 

所以創造它和檢查工作正常,我決定把它計算的一個很大的差距後兩個日期之間的時間,像2個月左右,但最大的差距,它可以計算爲:

34D 22H59米59S

任何人都知道爲什麼? (這是一個大問題)

我就知道出了與查詢功能,因爲發生的事情:

SEC_TO_TIME(TIMESTAMPDIFF(SECOND, created, sol_provided)) AS timeDiff 

我有自個小時,它可以計算出是像848小時或差距最大的一個麻煩所以。

回答

1

從MySQL的網站(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timediff

The result returned by TIMEDIFF() is limited to the range allowed for TIME values

然後,如果你繼續(http://dev.mysql.com/doc/refman/5.5/en/time.html)按時節,

TIME values may range from '-838:59:59' to '838:59:59'. The hours part may be so large because the TIME type can be used not only to represent a time of day (which must be less than 24 hours), but also elapsed time or a time interval between two events (which may be much greater than 24 hours, or even negative).

+0

既然你更快地尋找它,我給你正確的答案,即使我更準確地解釋那裏。謝謝你的時間。非常感謝。 – ederollora

0

好,我找到了答案。事實證明,TIMEDIFF(a,b)返回一個TIME類型的值(不在文檔中,但是如果你執行它,你可以看到它)。

TIMEDIFF()返回expr1 - expr2表示爲時間值。 expr1和 expr2是時間或日期和時間表達式,但都必須是相同類型的 。

約在限制我發現:

TIME值的範圍可以從「-838:59:59'到「838:59:59「。

所以,如果我們要計算的間隔大於838小時我們需要小號olution,這可能是下列之一:

# Number of days * 24 + time difference. 

SELECT 
DATEDIFF('2010-01-01 00:00:00', '2009-01-01 00:00:00') * 24 
+ EXTRACT(HOUR FROM '2010-01-01 00:00:00') 
- EXTRACT(HOUR FROM '2009-01-01 00:00:00') 

給我的第一功能的另一種解決方案是以下其中一個輕鬆超越的限制:

DELIMITER // 

CREATE FUNCTION time_full(A DATETIME, B DATETIME) RETURNS VARCHAR(30) 

BEGIN 
    RETURN CONCAT(TIMESTAMPDIFF(day,A,B),'d ', 
    MOD(TIMESTAMPDIFF(hour,A,B), 24),'h ', 
    MOD(TIMESTAMPDIFF(minute,A,B), 60),'m ' 
    MOD(TIMESTAMPDIFF(second,A,B), 60),'s '); 
END// 

DELIMITER ;