Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gruppieren von MySQL datetime in Intervalle unabhängig von der Zeitzone

Sie können TIMESTAMPDIFF nach Zeitintervallen gruppieren:

Für ein bestimmtes Stundenintervall können Sie Folgendes verwenden:

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

Ersetzen Sie die Vorkommen von 2012-08-03 00:00:00 mit Ihrem Mindesteingabedatum.

<n> ist Ihr angegebenes Intervall in Stunden (alle 2 Stunden, 3 Stunden usw.), und Sie können dasselbe für Minuten tun:

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

Wobei <n> ist Ihr angegebenes Intervall in Minuten (alle 45 Minuten, 90 Minuten usw.).

Stellen Sie sicher, dass Sie Ihr Mindesteingabedatum eingeben (in diesem Beispiel 2012-08-03 00:00:00). ) als zweiten Parameter für TIMESTAMPDIFF .

BEARBEITEN: Wenn Sie sich keine Gedanken darüber machen möchten, welche Intervalleinheit Sie in TIMESTAMPDIFF auswählen sollen Funktion, dann natürlich nur das Intervall in Sekunden (300 =5 Minuten, 3600 =1 Stunde, 7200 =2 Stunden usw.)

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: Um Ihren Kommentar bezüglich der Verringerung der Anzahl der Bereiche in der Anweisung zu adressieren, in denen Sie Ihr Mindestparameterdatum übergeben müssen, können Sie Folgendes verwenden:

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

Und übergeben Sie einfach Ihren minimalen Datetime-Parameter einmal in die Join-Unterauswahl.

Sie können sogar eine zweite Spalte in der Join-Unterauswahl für Ihr Sekundenintervall erstellen (z. B. 3600 ) und nennen Sie die Spalte etwa so wie secinterval ... dann ändern Sie den <n> 's zu b.secinterval , also müssen Sie Ihren minimalen Datumsparameter UND das Intervall jeweils nur einmal übergeben.

SQLFiddle-Demo