Agrupar em intervalos
Você deve usar
group by
para criar um grupo para cada intervalo sobre o qual você deseja calcular a média. 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
Isso faz uso do fato de que uma data e hora podem ser convertidas implicitamente em um número, que terá o formato
YYMMDDhhmmss
. Dividindo esse número por 100 tira os segundos, e da mesma forma dividindo por 500 produz um número único para cada intervalo de 5 minutos. A coluna adicional que selecionei dará o meio do intervalo:qualquer hora do intervalo (aqui escolhendo o mínimo, mas isso não importa muito), transformado naquele número de intervalo de 5 minutos, de volta em uma data e hora número e, em seguida, adicionando dois minutos e meio. Você pode usar uma sintaxe semelhante para calcular o início (simplesmente deixe o
+ 230
out) ou (inclusive) end (+ 459
) do intervalo. Testado usando sqlfiddle .
Manuseio de fim de intervalo
Observe que seu
BETWEEN
intervalo incluirá linhas de 15:30:00
mas nenhum outro do intervalo começou naquele momento. Talvez você queira excluir o final do intervalo de sua seleção:where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Por que você recebe NULL
Por que sua consulta gera
NULL
:Para fazer aritmética de intervalo, você não coloca todo o intervalo entre aspas e usa nomes singulares para unidades de tempo. Ou seja '2012-09-08 15:30:00' + INTERVAL 5 minute
Mas isso simplesmente estenderia o intervalo para
2012-09-08 15:35:00
e ainda não criar os intervalos de 5 minutos que você deseja. Do jeito que você escreveu, você está tentando adicionar duas strings, o que não é possível no MySQL, a menos que as strings possam ser convertidas em números, caso em que esses números serão adicionados. Você pode querer usar aritmética de intervalo para calcular o final exclusivo do intervalo, ou seja, o primeiro segundo depois o intervalo:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Basta adicionar
500
em vez do 230
da minha consulta não funcionará, pois o número resultante pode representar uma data inválida para o último intervalo de cada hora.