Zunächst einmal haben Sie einen subtilen Fehler in Ihrem WHERE
Klausel. Sie benötigen:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
weil Ihre Viertelstundenbereiche von einem bestimmten Zeitpunkt bis zum Moment vorher laufen eine andere bestimmte Zeit. Sie benötigen <
, nicht <=
, für das Ende Ihres Zeitraums.
Dann benötigen Sie einen Ausdruck, der ein beliebiges DATETIME
annehmen kann -Ausdruck und konvertieren Sie ihn in DATETIME
des Beginns der Viertelstunde, in der es auftritt.
Dies wird das tun.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE
Es wird zum Beispiel '2014-05-07 14:53:22'
, in '2014-05-07 14:45:00'
.
Sie können es als gespeicherte Funktion wie folgt definieren, wenn Sie möchten:
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 ;
Sie können Ihre Abfrage dann wie folgt schreiben:
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
Das ist hier aufgeschrieben. http://www.plumislandmedia.net/mysql/sql-reporting- Zeitintervalle/