Vous pouvez utiliser TIMESTAMPDIFF
pour regrouper par intervalles de temps :
Pour un intervalle d'heures spécifié, vous pouvez utiliser :
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
Remplacer les occurrences de 2012-08-03 00:00:00
avec votre date de saisie minimum.
<n>
est votre intervalle spécifié en heures (tous les 2
heures, 3
heures, etc.), et vous pouvez faire de même pendant quelques minutes :
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
Où <n>
est votre intervalle spécifié en minutes (tous les 45
minutes, 90
minutes, etc.).
Assurez-vous de transmettre votre date de saisie minimale (dans cet exemple 2012-08-03 00:00:00
) comme deuxième paramètre de TIMESTAMPDIFF
.
MODIF : Si vous ne voulez pas vous soucier de l'unité d'intervalle à choisir dans le TIMESTAMPDIFF
fonction, puis bien sûr il suffit de faire l'intervalle par secondes (300 =5 minutes, 3600 =1 heure, 7200 =2 heures, etc.)
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 : Pour répondre à votre commentaire concernant la réduction du nombre de zones dans la déclaration où vous devez transmettre votre date de paramètre minimum, vous pouvez utiliser :
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
Et transmettez simplement votre paramètre datetime minimum une fois dans la sous-sélection de jointure.
Vous pouvez même créer une deuxième colonne dans la sous-sélection de jointure pour votre intervalle de secondes (par exemple, 3600
) et nommez la colonne quelque chose comme secinterval
... puis modifiez le <n>
's à b.secinterval
, vous n'avez donc qu'à transmettre votre paramètre de date minimum ET votre intervalle une fois chacun.