Tout d'abord, vous avez une erreur subtile dans votre WHERE
clause. Vous avez besoin :
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
parce que vos plages de quart d'heure vont d'une heure particulière jusqu'à l'instant avant un autre moment particulier. Vous avez besoin de <
, pas <=
, pour la fin de votre plage horaire.
Ensuite, vous avez besoin d'une expression qui peut prendre un DATETIME
arbitraire expression et convertissez-la en DATETIME
du début du quart d'heure où il se produit.
Ceci fera cela.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE
Il tourne par exemple '2014-05-07 14:53:22'
, dans '2014-05-07 14:45:00'
.
Vous pouvez le définir comme une fonction stockée comme celle-ci si vous le souhaitez :
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 ;
Vous pouvez ensuite rédiger votre requête comme ceci :
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
C'est écrit ici. http://www.plumislandmedia.net/mysql/sql-reporting- intervalles de temps/