2010-04-27 6 views
10

Ich habe eine Tabelle namens Sitzungen mit zwei datetime Spalten: Start und Ende.MySQL: Durchschnitt der Zeit Unterschiede erhalten?

Für jeden Tag (JJJJ-MM-TT) kann es viele verschiedene Start- und Endzeiten geben (HH: ii: ss). Ich muss einen täglichen Durchschnitt aller Unterschiede zwischen diesen Start- und Endzeiten finden.

Ein Beispiel für ein paar Zeilen wären:

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 
... 

Die Zeitdifferenzen (in Sekunden) für 2010-04-10 wären:

50 
60 
300 
5 

Der Durchschnitt für 2010-04- 10 wäre 103,75 Sekunden. Ich möchte meine Frage etwas wie zurückzukehren:

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

Ich kann die Zeitdifferenz von Startdatum gruppiert bekommen, aber ich bin nicht sicher, wie der Durchschnitt zu erhalten. Ich habe versucht, mit der AVG-Funktion, aber ich denke, es funktioniert nur direkt auf Spaltenwerte (und nicht das Ergebnis einer anderen Aggregatfunktion).

Das ist, was ich habe:

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

Gibt es eine Möglichkeit, die durchschnittlich TIMEDIFF für jedes Datum Gruppe beginnen zu bekommen? Ich bin neu, Funktionen zu aggregieren, vielleicht verstehe ich etwas falsch. Wenn Sie eine alternative Lösung kennen, teilen Sie diese bitte mit.

Ich könnte es immer ad hoc machen und den Durchschnitt manuell in PHP berechnen, aber ich frage mich, ob es eine Möglichkeit gibt, es in MySQL zu tun, so dass ich vermeiden kann, eine Reihe von Schleifen zu laufen.

Danke.

Antwort

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

Ja, das ist es, ich habe es erkannt, sobald ich die Frage gepostet habe. Ich fühle mich irgendwie albern. Der Grund, warum ich es nicht zum Laufen brachte, war, dass ich AVG (Timediff) machte, und ich denke, dass Sie den Ausdruck direkt übergeben müssen und keinen Alias ​​verwenden können. Vielen Dank. – nebs

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

Dies wird die durchschnittliche als Zeit vorherige Antwort geben Nummer geben.