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.