繁体   English   中英

如何将数据库记录分组为15分钟的时间间隔

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM