Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como agrupar registros de banco de dados em intervalos de tempo de 15 minutos


Primeiro de tudo, você tem um erro sutil no seu WHERE cláusula. Você precisa:
where access_time >= '2013-05-28 02:00:00' 
  and access_time < '2013-05-28 10:00:00'

porque seus intervalos de quarto de hora vão de um determinado horário até o momento antes outro momento específico. Você precisa de < , não <= , para o final do seu intervalo de tempo.

Então, você precisa de uma expressão que possa receber um DATETIME arbitrário expressão e convertê-lo para o DATETIME do início do quarto de hora em que ocorre.

Isso vai fazer isso.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
            INTERVAL (MINUTE(datestamp) -
                      MINUTE(datestamp) MOD 15) MINUTE

Acontece, por exemplo '2014-05-07 14:53:22' , em '2014-05-07 14:45:00' .

Você pode defini-lo como uma função armazenada como esta, se quiser:
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 ;

Você pode então escrever sua consulta assim:
 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

Isso está escrito aqui. http://www.plumislandmedia.net/mysql/sql-reporting- intervalos de tempo/