2010-04-27 13 views
10

Mam tabela o nazwie Sesje z dwiema kolumnami datetime: początek i koniec.MySQL: Uzyskaj średnią różnic czasowych?

Dla każdego dnia (RRRR-MM-DD) może występować wiele różnych czasów rozpoczęcia i zakończenia (HH: ii: ss). Muszę znaleźć średnią dzienną wszystkich różnic między tymi godzinami rozpoczęcia i zakończenia.

Przykładem kilku rzędach może być:

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

Różnice czasu (w sekundach) 2010-04-10 to:

50 
60 
300 
5 

Średnia dla 2010-04- 10 wynosiłoby 103,75 sekundy. Chciałbym wrócić do mojej kwerendy coś takiego:

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

mogę uzyskać różnicę czasu pogrupowany według daty rozpoczęcia, ale nie jestem pewien, jak uzyskać średnią. Próbowałem użyć funkcji AVG, ale myślę, że działa ona tylko bezpośrednio na wartościach kolumn (a nie na wyniku innej funkcji agregującej).

To jest to, co mam:

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

Czy istnieje sposób, aby uzyskać średnio timediff dla każdej grupy datę rozpoczęcia? Jestem nowy w agregowaniu funkcji, więc może coś nie rozumiem. Jeśli znasz alternatywne rozwiązanie, udostępnij je.

Zawsze mogę to zrobić ad hoc i obliczyć średnią ręcznie w PHP, ale zastanawiam się, czy istnieje sposób, aby to zrobić w MySQL, dzięki czemu mogę uniknąć uruchamiania wielu pętli.

Dzięki.

Odpowiedz

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

Tak, właśnie, zdałem sobie z tego sprawę, jak tylko opublikuję pytanie. Czuję się trochę głupio. Powodem, dla którego nie mogłem go uruchomić, jest to, że robiłem AVG (timediff), i myślę, że musisz przekazać wyrażenie bezpośrednio i nie możesz użyć aliasu. Dzięki. – 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) 

To daje średnią jako czas poprzednia odpowiedź jest podając numer.

Powiązane problemy