【问题标题】:MySql Query Grouping by TimeMySql 查询按时间分组
【发布时间】:2011-07-24 19:22:12
【问题描述】:

我正在尝试创建一个报告来了解下订单的时间,因此我需要按时间对它们进行汇总和分组。例如,我想要 1 到 1:59 之间的所有订单的总和,然后下一行列出 2:00 到 2:59 之间的所有订单的总和,等等。该字段是一个日期时间变量,但对于生活我我一直无法找到正确的查询来做到这一点。任何让我走上正确道路的建议将不胜感激。

谢谢

【问题讨论】:

  • mysql/sqlite/oracle/postgresql/sql-server?

标签: mysql sql count group-by


【解决方案1】:

如果运气好是 mysql 并且订单总和是指订单数量而不是价值金额:

select date_format(date_field, '%Y-%m-%d %H') as the_hour, count(*)
from my_table
group by the_hour
order by the_hour

【讨论】:

  • 肯定越来越近了。你是对的,mysql和命令数。我的表中有大约 1600 行,但它似乎是按天计算的,而不是所有日期。这是查询的部分结果:2010-06-17 12:00:00 1 2010-07-28 22:00:00 1 2010-07-29 00:00:00 1 2010-07-29 07:00:00 1 2010-07-29 11:00:00 1 2010-07-29 20:00:00 2 2010-07-29 21:00:00 1 2010-07-30 09:00:00 1 2010-07-30 10:00:00 2 2010-07-30 11:00:00 1 2010-07-30 12:00:00 1 2010-07-30 15:00:00 1 2010-07-30 18:00:00 1 2010-07-30 19:00:00 1 2010-07-30 20:00:00 1 2010-07-30 21:00:00 1 2010-07-31 02:00:00 1 2010-0
  • 是的,查询针对所有 1600 行。我应该更清楚一点,查询产生了 110000 行的结果(这个论坛只让我复制 20 行左右),但它分解为日期:小时,而不是计算所有天中每个小时的订单(对于共 24 行)。例如,2010 年 7 月 29 日(见上文)有 6 个订单,1 个在午夜,1 个在上午 11 点,2 个在晚上 8 点,等等。我只是不知道如何组合所有天并按小时分解结果。这是我的查询: SELECT STR_TO_DATE( DATETIME, '%Y-%m-%d %H' ) AS the_hour, COUNT( * ) FROM orders GROUP BY the_hour ORDER BY the_hour
  • 非常非常接近。 ;) 当我仔细观察并意识到您是如何尝试实现这一点时,我意识到我们只需要小时部分而不是整个日期。成功!所以最终的结果是:SELECT DATE_FORMAT( DATETIME, '%H' ) AS the_hour, COUNT( * ) FROM orders GROUP BY the_hour ORDER BY the_hour谢谢你的帮助!
【解决方案2】:

这种分组之王(使用计算字段)肯定不会随着时间的推移而扩展。如果您确实需要经常执行此特定的 GROUP BY/ORDER BY,您应该创建一个额外的字段(一个 UNSIGNED TINYINT 字段就足够了)存储小时并在该列上放置一个 INDEX。

当然,如果您的表变得非常大,如果它很小(不能仅用记录数来说明,因为这实际上也是服务器配置和功能的问题),您可能不会注意到太多性能差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多