![](/img/trans.png)
[英]Explain MySQL Query for "How to group time column into 5 minute intervals"
[英]How to group datebase records into 15-minute time intervals
我在MySQL数据库中有一个表user_access
及其以下各列:
id int
user int
access_time datetime
我正在尝试运行一个查询,该查询提供给定user
在给定的一组时间戳记下以15分钟为间隔访问系统的次数( access_time
)。
我当前的查询是:
select user, count(user) as users from user_access
where (access_time between '2013-05-28 02:00:00' and '2013-05-28 10:00:00')
group by user
我想要达到的结果如下所示:
Time User No of Times
--------------------------------------------------
8:00am - 8:15am user1 20
8:00am - 8:15am user2 5
8:15am - 8:30am user1 15
8:15am - 8:30am user2 23
首先,您的WHERE
子句中有一个微妙的错误。 你需要:
where access_time >= '2013-05-28 02:00:00'
and access_time < '2013-05-28 10:00:00'
因为你一刻钟的范围从一个特定的时间运行,直到另一个特定时间之前的时刻。 在您的时间范围结束时,您需要<
,而不是<=
。
然后,您需要一个可以采用任意DATETIME
表达式的表达式,并将其转换为发生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-time-intervals/
您需要创建一个公式,该公式会将每个access_time转换为最近的四分之一小时。
就像是:
CONCAT(Hour(access_time),":",floor(Minute(access_time)/15))*15)
然后,您可以将该公式放入select语句和group by语句中。 您可以修改此伪代码语句以更改格式,添加每个季度的结束时间,等等。
我将通过使用datediff和round来解决它。
取一个任意日期,然后使用TIMESTAMPDIFF来获取小数。 将日期四舍五入到15分钟,然后按分组。
所以像
select TIMESTAMPDIFF(MINUTE,randDate,access_time) DIV 15 as time, user, count(id) 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 user, time
那么您要做的就是向后移动以使其看起来更漂亮。 使用时间将日期添加到randDate以回到15分钟间隔。
这很粗糙,但它应该给您足够的帮助,使您走上正确的道路。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.