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)
以下内容似乎可以工作,与您所拥有的非常接近:
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() 检查也应该能够识别出这一点。