Grupo a intervalos
Deberías usar group by
para crear un grupo para cada intervalo sobre el que desee promediar.
select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500
Esto hace uso del hecho de que una fecha y una hora se pueden convertir implícitamente en un número, que luego tendrá el formato YYMMDDhhmmss
. Dividir ese número por 100 elimina los segundos y, de manera similar, dividir por 500 produce un número único para cada intervalo de 5 minutos.
La columna adicional que seleccioné dará la mitad del intervalo:cualquier momento del intervalo (aquí eligiendo el mínimo, pero en realidad no importa), convertido en ese número de intervalo de 5 minutos, nuevamente en una fecha y hora número, y luego sumando dos minutos y medio. Puede usar una sintaxis similar para calcular el comienzo (simplemente deje el + 230
out) o (inclusive) fin (+ 459
) del intervalo.
Probado usando sqlfiddle .
Manejo de fin de rango
Tenga en cuenta que su BETWEEN
el rango incluirá filas desde 15:30:00
pero ningún otro del intervalo comenzó en ese momento. Tal vez quiera excluir el final del rango de su selección:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Por qué obtienes NULL
En cuanto a por qué su consulta produce NULL
:Para hacer aritmética de intervalos, no encierra todo el intervalo entre comillas y usa nombres singulares para las unidades de tiempo. Es decir,
'2012-09-08 15:30:00' + INTERVAL 5 minute
Pero esto simplemente extendería el rango a 2012-09-08 15:35:00
y sigues sin crear esos intervalos de 5 minutos que quieres. De la forma en que lo escribió, está tratando de agregar dos cadenas, lo que no es posible en MySQL a menos que las cadenas se puedan convertir en números, en cuyo caso se agregarán esos números.
Es posible que desee utilizar la aritmética de intervalos para calcular el final exclusivo del intervalo, es decir, el primer segundo después el intervalo:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Simplemente agregando 500
en lugar del 230
de mi consulta no funcionará ya que el número resultante podría representar una fecha no válida para el último intervalo de cada hora.