sql >> Databasteknik >  >> RDS >> Mysql

Gruppera MySQL datetime i intervall oavsett tidszon

Du kan använda TIMESTAMPDIFF att gruppera efter tidsintervall:

För ett specificerat intervall på timmar kan du använda:

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(HOUR, '2012-08-03 00:00:00', timestamp) / <n>) * <n> HOUR AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

Ersätt förekomsterna av 2012-08-03 00:00:00 med ditt lägsta inmatningsdatum.

är ditt angivna intervall i timmar (varje 2 timmar, 3 timmar, etc.), och du kan göra detsamma i minuter:

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(MINUTE, '2012-08-03 00:00:00', timestamp) / <n>) * <n> MINUTE AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

Där är ditt angivna intervall i minuter (varje 45 minuter, 90 minuter, etc).

Se till att du anger ditt lägsta inmatningsdatum (i det här exemplet 2012-08-03 00:00:00 ) som den andra parametern till TIMESTAMPDIFF .

EDIT: Om du inte vill oroa dig för vilken intervallenhet du ska välja i TIMESTAMPDIFF funktion, så gör du naturligtvis bara intervallet i sekunder (300 =5 minuter, 3600 =1 timme, 7200 =2 timmar, etc.)

SELECT   '2012-08-03 00:00:00' + 
         INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, '2012-08-03 00:00:00', timestamp) / <n>) * <n> SECOND AS start_time,
         COUNT(*) AS total 
FROM     event 
WHERE    timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time

EDIT2: För att ta itu med din kommentar om att minska antalet områden i uttalandet där du måste skicka in ditt lägsta parameterdatum, kan du använda:

SELECT   b.mindate + 
         INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, b.mindate, timestamp) / <n>) * <n> SECOND AS start_time,
         COUNT(*) AS total 
FROM     event 
JOIN     (SELECT '2012-08-03 00:00:00' AS mindate) b ON timestamp >= b.mindate
GROUP BY start_time

Och skriv helt enkelt in din lägsta datetime-parameter en gång till undervalet join.

Du kan till och med göra en andra kolumn i anslutningsundervalet för ditt sekunders intervall (t.ex. 3600 ) och namnge kolumnen något som sekundsintervall ... ändra sedan 's till b.secinterval , så du behöver bara skicka in din minsta datumparameter OCH intervall en gång vardera.

SQLFiddle Demo



  1. Vad är skillnaden mellan BIT och TINYINT i MySQL?

  2. Använda Oracle JDeveloper med MySQL Database Service på Oracle Cloud Platform, del 2

  3. 4 sätt att hitta rader som innehåller små bokstäver i MariaDB

  4. Hur man inkluderar resultat som ligger på sista plats när man använder TOP-klausulen i SQL Server