2010-05-06 24 views
5

Estoy tratando de enumerar el número de registros por hora insertados en una base de datos durante las últimas 24 horas. Cada fila muestra los registros insertados esa hora, así como también cuántas horas atrás.MySQL: registros insertados por hora, durante las últimas 24 horas

Aquí está mi consulta ahora:

SELECT COUNT(*), FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY HOUR(time) 
ORDER BY time ASC 

ahora vuelve:

28 23 
62 23 
14 20 
1 4 
28 3 
19 1 

que muestra dos filas de 23 horas, cuando sólo debe mostrar una por hora. Creo que tiene algo que ver con el uso de NOW() en lugar de tener el tiempo al inicio de la hora, que no estoy seguro de cómo conseguirlo.

Debe haber una manera más simple de hacer esto.

Respuesta

4

Si ha agrupado por HOUR(time), entonces debe usar HOUR(time) en sus expresiones de selección, y no time. Por ejemplo:

SELECT HOUR(time), COUNT(*) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY HOUR(time) 
ORDER BY HOUR(time) 

Como alternativa se pueden agrupar por la expresión que desea devolver:

SELECT COUNT(*), FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
FROM `records` 
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR) 
GROUP BY FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 
ORDER BY FLOOR(TIME_TO_SEC(TIMEDIFF(NOW(), time))/3600) 

En caso de que se preguntan, es seguro que llamar NOW() varias veces en la misma consulta como esta. Desde manual:

Las funciones que devuelven la fecha o la hora actual cada una se evalúan solo una vez por consulta al inicio de la ejecución de la consulta. Esto significa que las referencias múltiples a una función como NOW() en una sola consulta siempre producen el mismo resultado.

Cuestiones relacionadas