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/