Först och främst har du ett subtilt fel i din WHERE
klausul. Du behöver:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
eftersom dina kvarttimmesintervall löper från en viss tidpunkt till ögonblicket före en annan speciell tid. Du behöver <
, inte <=
, för slutet av ditt tidsintervall.
Sedan behöver du ett uttryck som kan ta en godtycklig DATETIME
uttryck och konvertera det till DATETIME
av början av den kvartstimme då det inträffar.
Detta kommer att göra det.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE
Det blir till exempel '2014-05-07 14:53:22'
, till '2014-05-07 14:45:00'
.
Du kan definiera den som en lagrad funktion så här om du vill:
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 sedan skriva din fråga så här:
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
Detta är skrivet här. http://www.plumislandmedia.net/mysql/sql-reporting- tidsintervall/