Gruppera till intervall
Du bör använda group by
för att skapa en grupp för varje intervall som du vill göra ett genomsnitt över.
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
Detta utnyttjar det faktum att ett datum och en tid implicit kan konverteras till ett tal, som då kommer att ha formatet YYMMDDhhmmss
. Att dividera ett sådant nummer med 100 tar bort sekunderna, och på liknande sätt dividera med 500 ger ett unikt nummer för varje 5-minutersintervall.
Den extra kolumnen jag valde kommer att ge mitten av intervallet:när som helst från intervallet (här väljer du minimum, men det spelar egentligen ingen roll), förvandlas till det 5-minutersintervallet, tillbaka till ett datum och tid antal och sedan lägga till två och en halv minut. Du kan använda liknande syntax för att beräkna början (lämna helt enkelt + 230
ut) eller (inklusive) slut (+ 459
) av intervallet.
Testad med sqlfiddle .
Hantera slutintervall
Observera att din BETWEEN
intervallet kommer att inkludera rader från 15:30:00
men inga andra från intervallet startade vid den tiden. Kanske vill du utesluta slutet av intervallet från ditt val:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Varför får du NULL
Om varför din fråga ger NULL
:För att göra intervallräkning omsluter du inte hela intervallet inom citattecken, och du använder singularnamn för tidsenheter. Dvs
'2012-09-08 15:30:00' + INTERVAL 5 minute
Men detta skulle helt enkelt utöka intervallet till 2012-09-08 15:35:00
och ändå inte skapa de 5-minutersintervaller du vill ha. Som du skrev det försöker du lägga till två strängar, vilket inte är möjligt i MySQL om inte strängarna kan konverteras till siffror, i vilket fall dessa siffror kommer att läggas till.
Du kanske vill använda intervallaritmetik för att beräkna det exklusiva slutet av intervallet, dvs. den första sekunden efter intervallet:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Lägg bara till 500
istället för 230
av min fråga kommer inte att fungera eftersom det resulterande talet kan representera ett ogiltigt datum för det sista intervallet av varje timme.