2013-03-11 59 views
1

我有一個查詢,我正在測試時間。Mysql timediff返回兩個不同的值

我得到兩個不同的時間,這使我懷疑我的數據的正確性。

這裏有兩個例子:

SELECT 
    users.fname as counselor, 
    count(session.anum) as students, 
    SEC_TO_TIME(AVG(TIME_TO_SEC(TIMEDIFF(starttime, signintime)))) AS 'AVG Wait Time', 
    SEC_TO_TIME(AVG(TIME_TO_SEC(TIMEDIFF(finishtime, starttime)))) AS 'AVG Session Length' 
FROM session 
    LEFT JOIN support 
     ON support.session_id = session.session_id 
    LEFT JOIN users 
     ON users.username = support.counselor 
WHERE session.status = 3 
GROUP BY fname; 

這將返回:

00:01:17 and 00:00:05 

下一個查詢是:

SELECT 
    users.fname as counselor, 
    count(session.anum) as students, 
    SEC_TO_TIME(AVG(TIMEDIFF(starttime, signintime))) AS 'AVG Wait Time', 
    SEC_TO_TIME(AVG(TIMEDIFF(finishtime, starttime))) AS 'AVG Session Length' 
FROM session 
    LEFT JOIN support 
     ON support.session_id = session.session_id 
    LEFT JOIN users 
     ON users.username = support.counselor 
WHERE session.status = 3 
GROUP BY fname; 

00:01:37 and 00:00:05 

爲什麼會出現這種情況和結果集是我應該去相信?如果任何人能夠清除我的困惑,會很樂意。

回答

3

TIMEDIFF()返回一個字符串,例如:

TIMEDIFF('13:07:33', '9:5:37') -> 04:01:56 

如果直接把這個費用分攤,MySQL將嘗試投04:01:56爲int,並與avg(04),而不是結束。

這就是爲什麼你必須time_to_sec,它返回的時間值作爲一個簡單的INT:14516,可直接取平均值。

+0

啊,所以TIME_TO_SEC版本的查詢是最可靠的?最好是用TIMESTAMPDIFF()代替? – RaGe10940 2013-03-11 17:57:42

+0

這是真的。 'AVG()'和int一起使用。這將獲取非數字字符之前的所有數字,並刪除它們後面的所有數字。例子是'123!456 - > 123'。幹得好馬克。 – Mic1780 2013-03-11 17:58:11

+0

當我等待接受答案時,是否最好使用TIMESTAMPDIFF() – RaGe10940 2013-03-11 17:59:56