datetime - MySQL:过去 24 小时按小时插入的记录

标签 datetime mysql timestamp

我正在尝试列出过去 24 小时内每小时插入数据库的记录数。每行显示该小时插入的记录,以及几小时前插入的记录。

现在这是我的查询:

SELECT COUNT(*), FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(time)
ORDER BY time ASC

现在它返回:

28  23
62  23
14  20
1    4
28  3
19  1

显示 23 小时前的两行,而当时它应该每小时只显示一行。 我认为这与使用 NOW() 而不是在一小时开始时获取时间有关,我不确定如何获取时间。

一定有更简单的方法来做到这一点。

最佳答案

如果您按 HOUR(time) 分组,那么您应该在选择表达式中使用 HOUR(time),而不是 time。例如:

SELECT HOUR(time), COUNT(*)
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(time)
ORDER BY HOUR(time)

或者,您可以按要返回的表达式进行分组:

SELECT COUNT(*), FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
FROM `records`
WHERE time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )
ORDER BY FLOOR( TIME_TO_SEC( TIMEDIFF( NOW(), time)) / 3600 )

如果您想知道,在同一个查询中多次调用 NOW() 是安全的。来自manual :

Functions that return the current date or time each are evaluated only once per query at the start of query execution. This means that multiple references to a function such as NOW() within a single query always produce the same result.

关于datetime - MySQL:过去 24 小时按小时插入的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783740/

相关文章:

mysql - 搜索查询中最匹配的词

MySQL获取最近5分钟时间戳字段的最大值和最小值

python : Converting time string with different timezone to host timezone datetime object?

mysql - Zend_Db_Expr ('NOW()' )和 Mysql 中的日期时间

javascript - 按日期排序,然后按位置排序

java - 将日期和时间转换为时间戳格式 java "2019-02-21T14:10:18.161+0000"

python - 读取文件时使用 lambda 函数将日期转换为时间戳

python - 使用变量和时间戳的输出写入文件

mysql - MySQL 中的列值在 1 小时后设置为某个值后如何重置?

Python Mysqld : After reinstall, 仅当变量元组有尾随逗号时才有效