mysql将日期间隔按过去10分钟分组

92vpleto  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(604)

我有一个包含消息和时间戳字段的数据库。我要选择过去10分钟中每分钟的计数。这是我当前的查询:

SELECT date_format(timestamp, '%H:%i:%s'), COUNT(*) as count
FROM test
WHERE timestamp BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW() 
GROUP by
    DATE_FORMAT(timestamp, '%i')
    ORDER BY timestamp ASC

这几乎是工作,因为我想它,给我看过去10分钟的计数。
但是,由于我是按时间戳分组的,所以除了最后一分钟之外的每一分钟,我都从第一个数据库条目中获取每分钟的计数,这使得我的第一个和最后一个结果比其他结果少得多。
如图所示:

时间戳计数
11:25:35 6
11:26:03 11
11:27:05 11
11:28:01 12
11:29:03 12
11:30:05 10
11:31:01 12
11:32:03 12
11:33:05 11
11:34:01 12
11:35:03 5
我要寻找的是一种按分钟分组的方法,使用now()之类的内容,而不是我的时间戳,如本例所示。
时间戳计数
11:25:35 11
11:26:35 12
11:27:35 11
11:28:35 11
11:29:35 11
11:30:35 11
11:31:35 11
11:32:35 11
11:33:35 11
11:34:35 11

提前谢谢!

r1zk6ea1

r1zk6ea11#

问题在于 WHERE 条款。在进行聚合之前,需要删除多余的秒数。
一种方法是转换为秒,除以60,截断数字,然后乘以60。下面将值转换回日期/时间值,因此将使用该列上的索引:

SELECT date_format(timestamp, '%H:%i:%s'), COUNT(*) as count
FROM test
WHERE timestamp >= from_unixtime(floor(unix_timestamp(now()) / 60) * 60) - interval 10 minute AND
      timestamp < from_unixtime(floor(unix_timestamp(now()) / 60) * 60)
GROUP BY DATE_FORMAT(timestamp, '%i')
ORDER BY timestamp ASC

相关问题