Trước hết, bạn có một lỗi nhỏ trong WHERE
của mình mệnh đề. Bạn cần:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
bởi vì phạm vi một phần tư giờ của bạn chạy từ một thời điểm cụ thể cho đến thời điểm trước thời gian cụ thể khác. Bạn cần <
, không phải <=
, trong khoảng thời gian cuối cùng của bạn.
Sau đó, bạn cần một biểu thức có thể mất DATETIME
tùy ý và chuyển đổi nó thành DATETIME
vào đầu một phần tư giờ mà nó xảy ra.
Điều này sẽ làm được điều đó.
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00:00') +
INTERVAL (MINUTE(datestamp) -
MINUTE(datestamp) MOD 15) MINUTE
Nó lần lượt, ví dụ:'2014-05-07 14:53:22'
, thành '2014-05-07 14:45:00'
.
Bạn có thể định nghĩa nó như một hàm được lưu trữ như thế này nếu bạn muốn:
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 ;
Sau đó, bạn có thể viết truy vấn của mình như sau:
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
Điều này được viết ở đây. http://www.plumislandmedia.net/mysql/sql-reporting- khoảng thời gian /