Først og fremmest har du en subtil fejl i din WHERE
klausul. Du skal bruge:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
fordi dine kvarterstimer løber fra et bestemt tidspunkt til øjeblikket før en anden bestemt tid. Du skal bruge <
, ikke <=
, for slutningen af dit tidsinterval.
Så har du brug for et udtryk, der kan tage en vilkårlig DATETIME
udtryk og konverter det til DATETIME
af begyndelsen af det kvarter, hvor det forekommer.
Dette vil gøre det.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE
Den bliver f.eks. '2014-05-07 14:53:22'
, ind i '2014-05-07 14:45:00'
.
Du kan definere den som en gemt funktion som denne, hvis du vil:
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 ;
Du kan derefter skrive din forespørgsel sådan her:
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
Det er skrevet her. http://www.plumislandmedia.net/mysql/sql-reporting- tidsintervaller/