На първо място, имате фина грешка във вашия WHERE
клауза. Нуждаете се от:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
защото вашите четвъртчасови диапазони се изпълняват от определено време до момента преди друг конкретен път. Трябва ви <
, а не <=
, за края на вашия период от време.
След това се нуждаете от израз, който може да приеме произволен DATETIME
израз и го преобразувайте в DATETIME
от началото на четвърт час, в който се случва.
Това ще направи това.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE
Оказва се, например '2014-05-07 14:53:22'
, в '2014-05-07 14:45:00'
.
Можете да го дефинирате като съхранена функция като тази, ако желаете:
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 ;
След това можете да напишете заявката си така:
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
Това е написано тук. http://www.plumislandmedia.net/mysql/sql-reporting- времеви интервали/