2010-04-27 117 views
10

我有一個名爲Sessions和兩個日期時間列的表:開始和結束。MySQL:求平均時差?

對於每一天(YYYY-MM-DD),可以有許多不同的開始和結束時間(HH:ii:ss)。我需要找到這些開始和結束時間之間所有差異的日平均值。

幾排的一個例子是:

start: 2010-04-10 12:30:00 end: 2010-04-10 12:30:50 
start: 2010-04-10 13:20:00 end: 2010-04-10 13:21:00 
start: 2010-04-10 14:10:00 end: 2010-04-10 14:15:00 
start: 2010-04-10 15:45:00 end: 2010-04-10 15:45:05 
start: 2010-05-10 09:12:00 end: 2010-05-10 09:13:12 
... 

爲2010-04-10的時間差(秒)將是:

50 
60 
300 
5 

平均爲2010-04- 10將是103.75秒。我想我的查詢返回的東西,如:

day: 2010-04-10 ave: 103.75 
day: 2010-05-10 ave: 72 
... 

我可以通過開始日期分組的時間差,但我不知道怎麼去平均值。我試過使用AVG函數,但我認爲它只能直接用於列值(而不是另一個聚合函數的結果)。

這是我有:

SELECT 
    TIME_TO_SEC(TIMEDIFF(end,start)) AS timediff 
FROM 
    Sessions 
GROUP BY 
    DATE(start) 

有沒有辦法讓timeDiff測量平均每個開始日期組?我是新來的聚合函數,所以也許我誤解了一些東西。如果您知道備用解決方案,請分享。

我可以隨時做到ad hoc,並在PHP中手動計算平均值,但我想知道是否有辦法在MySQL中這樣做,這樣我就可以避免運行一堆循環。

謝謝。

回答

15
SELECT DATE(start) AS startdate, AVG(TIME_TO_SEC(TIMEDIFF(end,start))) AS timediff 
FROM Sessions 
GROUP BY 
     startdate 
+0

對,就是這樣,我一發現問題就意識到了。我覺得有點傻。我無法實現它的原因是我在做AVG(timediff),我想你需要直接傳遞表達式並且不能使用別名。謝謝。 – nebs 2010-04-27 14:57:41

1
SELECT DATE(start) AS startdate, SEC_TO_TIME(AVG(TIME_TO_SEC(TIMEDIFF((end,start))))) AS avgtimediff 
FROM Sessions 
GROUP BY DATE(start) 

這會給隨着時間以前的答案是給數目的平均值。