sql >> Database teknologi >  >> RDS >> Mysql

Gruppering af MySQL datetime i intervaller uanset tidszone

Du kan bruge TIMESTAMPDIFF at gruppere efter tidsintervaller:

For et specificeret interval på timer kan du bruge:

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

Erstat forekomsterne af 2012-08-03 00:00:00 med din minimumsindtastningsdato.

er dit angivne interval i timer (hver 2 timer, 3 timer osv.), og du kan gøre det samme i minutter:

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

Hvor er dit angivne interval i minutter (hver 45 minutter, 90 minutter osv.).

Sørg for, at du indtaster din minimumsindtastningsdato (i dette eksempel 2012-08-03 00:00:00 ) som den anden parameter til TIMESTAMPDIFF .

EDIT: Hvis du ikke vil bekymre dig om, hvilken intervalenhed du skal vælge i TIMESTAMPDIFF funktion, så laver du selvfølgelig bare intervallet i sekunder (300 =5 minutter, 3600 =1 time, 7200 =2 timer osv.)

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: For at adressere din kommentar vedrørende reduktion af antallet af områder i erklæringen, hvor du skal passere din minimumsparameterdato, kan du bruge:

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

Og indsend blot din minimum datetime-parameter én gang i join-undervalget.

Du kan endda lave en anden kolonne i join-undervalget for dit sekunders interval (f.eks. 3600 ) og navngiv kolonnen noget som sekundinterval ... skift derefter 's til b.secinterval , så du skal kun indtaste din minimumsdatoparameter OG interval én gang hver.

SQLFiddle Demo



  1. datoformat i node.JS

  2. formater interval med to_char

  3. Crystal Reports vs. Microsoft SQL Server Reporting Services

  4. Sådan installeres PostgreSQL på macOS