sql >> Base de Datos >  >> RDS >> Mysql

Cómo agrupar registros de bases de datos en intervalos de tiempo de 15 minutos

En primer lugar, tiene un error sutil en su WHERE cláusula. Necesitas:

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

porque sus rangos de cuarto de hora van desde un momento particular hasta el momento anterior otro momento en particular. Necesitas < , no <= , para el final de su intervalo de tiempo.

Luego, necesita una expresión que pueda tomar un DATETIME arbitrario expresión y convertirla a DATETIME del comienzo del cuarto de hora en que se produce.

Esto hará eso.

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

Resulta, por ejemplo, '2014-05-07 14:53:22' , en '2014-05-07 14:45:00' .

Puede definirlo como una función almacenada como esta si lo desea:

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 ;

A continuación, puede escribir su consulta de esta manera:

 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

Esto está escrito aquí. http://www.plumislandmedia.net/mysql/sql-reporting- intervalos de tiempo/