使用DATE_SUB选择小于5分钟的行

Tom*_*son 8 mysql sql datetime timestamp date

我有一张桌子每分钟收到数百个请求.我遇到的问题是我需要一种方法来只选择过去5分钟内插入的行.我在尝试这个:

SELECT count(id) as count, field1, field2
FROM table
WHERE timestamp > DATE_SUB(NOW(), INTERVAL 5 MINUTE)
ORDER BY timestamp DESC
Run Code Online (Sandbox Code Playgroud)

我的问题是它返回70k +结果并计数.我不确定我做错了什么,但我很想得到一些帮助.另外,如果有一种方法可以按分钟对它们进行分组,看起来像:

| count | field1 | field2 | 
----------------------------
Run Code Online (Sandbox Code Playgroud)

我很喜欢这方面的帮助和指导,所以请让我知道你的想法.

Sal*_*n A 13

你真的不需要DATE_ADD/DATE_SUB,日期算术更简单:

SELECT COUNT(id), DATE_FORMAT(`timestamp`, '%Y-%m-%d %H:%i')
FROM `table`
WHERE `timestamp` >= CURRENT_TIMESTAMP - INTERVAL 5 MINUTE
GROUP BY 2
ORDER BY 2
Run Code Online (Sandbox Code Playgroud)


gfo*_*une 4

以下内容似乎可以工作,与您所拥有的非常接近:

SELECT 
  MINUTE(date_field) as `minute`,
  count(id) as count
FROM table 
WHERE date_field > date_sub(now(), interval 5 minute)
GROUP BY MINUTE(date_field)
ORDER BY MINUTE(date_field);
Run Code Online (Sandbox Code Playgroud)

请注意添加的列以显示分钟,以及将结果收集到相应分钟的 GROUP BY 子句。想象一下,您有 5 个小桶,上面贴着最后 5 分钟的标签。现在想象一下,您将每行 4 分钟前的数据都扔进了它自己的桶中。count() 然后将计算每个桶中找到的条目数。这是 GROUP BY 工作原理的快速可视化。 如果您需要更多信息, http://www.tizag.com/mysqlTutorial/mysqlgroupby.php似乎是 GROUP BY 上不错的文章。

如果您运行该程序并且每分钟的条目数似乎太高,您将需要进行一些故障排除。尝试将 COUNT(id) 替换为 MAX(date_field) 和 MIN(date_field),这样您就可以了解它正在捕获哪种日期。如果 MIN() 和 MAX() 在该范围内,则写入数据库的数据可能比您意识到的要多。

您还可以仔细检查是否没有将来的日期,因为它们都将> now()。如果存在问题,上面提到的 MIN()/MAX() 检查也应该能够识别出这一点。