2010-04-27 11 views
10

Ho una tabella denominata Sessioni con due colonne datetime: start e end.MySQL: ottieni una media delle differenze di orario?

Per ogni giorno (AAAA-MM-GG) possono esserci molti orari di inizio e fine diversi (HH: ii: ss). Devo trovare una media giornaliera di tutte le differenze tra questi orari di inizio e di fine.

Un esempio di poche righe sarebbe:

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

Le differenze di tempo (in secondi) per 2010-04-10 sarebbe:

50 
60 
300 
5 

La media per 2010-04- 10 sarebbe 103,75 secondi. Vorrei che il mio query per restituire qualcosa di simile:

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

posso ottenere la differenza di tempo raggruppati per data di inizio ma non sono sicuro di come ottenere la media. Ho provato a utilizzare la funzione di AVG, ma penso che funzioni solo direttamente sui valori delle colonne (piuttosto che sul risultato di un'altra funzione di aggregazione).

Questo è quello che ho:

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

C'è un modo per ottenere la media di TimeDiff a ogni accensione data? Sono nuovo per aggregare le funzioni, quindi forse sto fraintendendo qualcosa. Se si conosce una soluzione alternativa, si prega di condividere.

Potrei sempre farlo ad hoc e calcolare la media manualmente in PHP, ma mi chiedo se c'è un modo per farlo in MySQL, così posso evitare di eseguire una serie di loop.

Grazie.

risposta

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

Sì, è così, l'ho capito non appena ho postato la domanda. Mi sento un po 'stupido. Il motivo per cui non sono riuscito a farlo funzionare è che stavo facendo AVG (timediff), e suppongo che tu debba passare direttamente l'espressione e non possa usare un alias. Grazie. – 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) 

Questo vi darà la media il tempo precedente risposta sta dando il numero.

Problemi correlati