2010-04-27 13 views
10

Tengo una tabla llamada Sesiones con dos columnas de fecha y hora: inicio y fin.MySQL: Obtener diferencias de promedio de tiempo?

Para cada día (AAAA-MM-DD) puede haber muchos diferentes tiempos de inicio y fin (HH: ii: ss). Necesito encontrar un promedio diario de todas las diferencias entre estos tiempos de inicio y fin.

Un ejemplo de un par de filas sería:

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

las diferencias de tiempo (en segundos) para 2010-04-10 serían:

50 
60 
300 
5 

El promedio para 2010-04- 10 sería 103.75 segundos. Me gustaría que mi consulta para devolver algo como:

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

yo puede conseguir la diferencia de tiempo agrupados por fecha de inicio, pero no estoy seguro de cómo llegar a la media. Intenté usar la función AVG, pero creo que solo funciona directamente en los valores de columna (en lugar del resultado de otra función agregada).

Esto es lo que tengo:

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

¿Hay una manera de obtener el promedio de TIMEDIFF para cada grupo Iniciar la fecha? Soy nuevo para agregar funciones así que tal vez estoy malinterpretando algo. Si conoce una solución alternativa, por favor comparta.

Siempre podría hacerlo ad hoc y calcular el promedio de forma manual en PHP, pero me pregunto si hay una forma de hacerlo en MySQL para evitar ejecutar un montón de bucles.

Gracias.

Respuesta

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

Sí, eso es todo, me di cuenta tan pronto como publiqué la pregunta. Me siento un poco tonto. La razón por la que no pude hacer que funcione es porque estaba haciendo AVG (timediff), y supongo que debe pasar la expresión directamente y no puede usar un alias. Gracias. – 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) 

Esto le dará a la media como tiempo de respuesta anterior está dando número.

Cuestiones relacionadas