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/