Mysql
 sql >> Base de données >  >> RDS >> Mysql

Regroupement de la date et de l'heure de MySQL en intervalles, quel que soit le fuseau horaire

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

<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.

Démo SQLFiddle