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/