sql >> Database >  >> RDS >> Mysql

MySQL datetime groeperen in intervallen, ongeacht de tijdzone

U kunt TIMESTAMPDIFF groeperen op tijdsintervallen:

Voor een gespecificeerd interval van uren kunt u het volgende gebruiken:

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

Vervang de voorkomens van 2012-08-03 00:00:00 met uw minimale invoerdatum.

<n> is uw opgegeven interval in uren (elke 2 uur, 3 uren, enz.), en u kunt hetzelfde doen voor minuten:

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

Waar <n> is uw opgegeven interval in minuten (elke 45 minuten, 90 minuten, enz.).

Zorg ervoor dat u uw minimale invoerdatum doorgeeft (in dit voorbeeld 2012-08-03 00:00:00 ) als de tweede parameter voor TIMESTAMPDIFF .

BEWERKEN: Als je je geen zorgen wilt maken over welke intervaleenheid je moet kiezen in de TIMESTAMPDIFF functie, dan doe je het interval natuurlijk gewoon in seconden (300 =5 minuten, 3600 =1 uur, 7200 =2 uur, enz.)

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: Om uw opmerking met betrekking tot het verminderen van het aantal gebieden in de verklaring waar u uw minimale parameterdatum moet doorgeven aan te pakken, kunt u het volgende gebruiken:

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

En geef uw minimale datetime-parameter één keer door in de join-subselect.

Je kunt zelfs een tweede kolom maken in de join-subselect voor je secondeninterval (bijv. 3600 ) en noem de kolom iets als secinterval ... verander dan de <n> 's naar b.secinterval , dus u hoeft uw minimumdatumparameter EN -interval elk maar één keer in te voeren.

SQLFiddle-demo



  1. Geautomatiseerd testen van de desktop-applicatie:overzicht van doelmatigheid en frameworks

  2. Voeg afwisselende rijkleur toe aan het rapport SQL Server Reporting Services

  3. Kan het aantal rijen niet ophalen en ophalen bij gebruik van een door MySQLi voorbereide instructie

  4. PHP en MySQL optionele WHERE voorwaarden