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.