【问题标题】:MySQL: Records inserted by hour, for the last 24 hoursMySQL:过去 24 小时内按小时插入的记录
【发布时间】:2010-05-06 19:08:41
【问题描述】:

我正在尝试列出过去 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() 而不是在一小时开始时获取时间有关,我不确定如何获取。

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

【问题讨论】:

    标签: datetime mysql timestamp


    【解决方案1】:

    如果您按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

    每个返回当前日期或时间的函数在查询执行开始时每个查询只计算一次。这意味着在单个查询中多次引用 NOW() 等函数总是产生相同的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      相关资源
      最近更新 更多