Mysql
 sql >> Database >  >> RDS >> Mysql

Come raggruppare i record del database in intervalli di tempo di 15 minuti

Prima di tutto, hai un sottile errore nel tuo WHERE clausola. Hai bisogno di:

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

perché i tuoi intervalli di un quarto d'ora vanno da un'ora particolare fino al momento prima un altro momento particolare. Hai bisogno di < , non <= , per la fine del tuo intervallo di tempo.

Quindi, hai bisogno di un'espressione che possa accettare un DATETIME arbitrario espressione e convertirla in DATETIME dell'inizio del quarto d'ora in cui si verifica.

Questo lo farà.

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

Si trasforma, ad esempio, in '2014-05-07 14:53:22' , in '2014-05-07 14:45:00' .

Puoi definirla come una funzione memorizzata in questo modo se lo desideri:

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 ;

Puoi quindi scrivere la tua query in questo modo:

 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

Questo è scritto qui. http://www.plumislandmedia.net/mysql/sql-reporting- intervalli di tempo/