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

Comment regrouper les enregistrements de la base de données dans des intervalles de temps de 15 minutes

Tout d'abord, vous avez une erreur subtile dans votre WHERE clause. Vous avez besoin :

where access_time >= '2013-05-28 02:00:00' 
  and access_time < '2013-05-28 10:00:00'

parce que vos plages de quart d'heure vont d'une heure particulière jusqu'à l'instant avant un autre moment particulier. Vous avez besoin de < , pas <= , pour la fin de votre plage horaire.

Ensuite, vous avez besoin d'une expression qui peut prendre un DATETIME arbitraire expression et convertissez-la en DATETIME du début du quart d'heure où il se produit.

Ceci fera cela.

DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
            INTERVAL (MINUTE(datestamp) -
                      MINUTE(datestamp) MOD 15) MINUTE

Il tourne par exemple '2014-05-07 14:53:22' , dans '2014-05-07 14:45:00' .

Vous pouvez le définir comme une fonction stockée comme celle-ci si vous le souhaitez :

DELIMITER $$
DROP FUNCTION IF EXISTS `TRUNC_15_MINUTES`$$
CREATE  FUNCTION `TRUNC_15_MINUTES`(datestamp DATETIME) 
                 RETURNS DATETIME
    NO SQL
    DETERMINISTIC
    RETURN DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
                INTERVAL (MINUTE(datestamp) -
                          MINUTE(datestamp) MOD 15) MINUTE$$
DELIMITER ;

Vous pouvez ensuite rédiger votre requête comme ceci :

 select TRUNC_15_MINUTES(access_time) AS period_starting,
        user, count(user) as users 
   from user_access
 where access_time >= '2013-05-28 02:00:00' 
   and access_time <  '2013-05-28 10:00:00'
 group by TRUNC_15_MINUTES(access_time), user
 order by TRUNC_15_MINUTES(access_time), user

C'est écrit ici. http://www.plumislandmedia.net/mysql/sql-reporting- intervalles de temps/