Przede wszystkim masz subtelny błąd w swoim WHERE klauzula. Potrzebujesz:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
ponieważ Twoje przedziały kwadransowe biegną od określonej godziny do momentu przed innym konkretnym czasie. Potrzebujesz < , a nie <= , na koniec zakresu czasu.
Następnie potrzebujesz wyrażenia, które może przyjąć dowolną DATETIME wyrażenie i przekonwertuj je na DATETIME początku kwadransa, w którym występuje.
To zrobi to.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE
Okazuje się, na przykład '2014-05-07 14:53:22' , na '2014-05-07 14:45:00' .
Możesz zdefiniować ją jako funkcję przechowywaną w ten sposób, jeśli chcesz:
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 ;
Następnie możesz napisać zapytanie w ten sposób:
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
Jest to opisane tutaj. https://www.plumislandmedia.net/mysql/sql-reporting- przedziały czasowe/