2013-02-15 24 views
7

Quindi diciamo che abbiamo 3 campi, username, start_date, end_dateDifferenza media tra due date, raggruppate per un terzo campo?

Gli utenti avviano e arrestano più record, ad esempio sotto bob è stato avviato e arrestato due record.

bob 1/2/13 11:00 1/2/13 13:00 
jack 1/2/13 15:00 1/2/13 18:00 
bob 2/2/13 14:00 1/2/13 19:00 

Ho bisogno di conoscere la durata media (cioè diff tra inizio e fine), tra ore, per ciascun utente (cioè gruppo dall'utente, non solo per ogni riga).

non riesco a ottenere la mia testa intorno a come fare il diff, media e GROUP BY? Qualsiasi aiuto?

risposta

9

Non si specifica la granularità desiderata per il diff. Questo fa in giorni:

select username, avg(end_date - start_date) as avg_days 
from mytable 
group by username 

Se si desidera che la differenza in secondi, utilizzare datediff():

select username, avg(datediff(ss, start_date, end_date)) as avg_seconds 
... 

datediff può misurare la diff in qualsiasi unità di tempo fino agli anni variando il primo parametro, che può essere ss, mi, hh, dd, wk, mm o yy.

+0

data - data restituisce la differenza in giorni IIRC – Viehzeug

+0

@Viehzeug aggiunto soluzione per secondi – Bohemian

+0

Wow, ok, più semplice di quanto immaginassi. Suppongo che stavo diventando più complesso nella mia testa di quanto avrebbe dovuto essere. –

2
SELECT username, AVG(TIMESTAMPDIFF(HOUR, start_date, end_date)) 
FROM table 
GROUP BY username 
+0

Grazie per questo, un grande aiuto molto veloce. Purtroppo non posso spuntare due risposte. –