【问题标题】:Rails & Postgresql: how to group queries by hour?Rails & Postgresql:如何按小时对查询进行分组?
【发布时间】:2013-02-17 09:21:08
【问题描述】:

如何在 Postgres & Rails 中按小时分组?我已经阅读了很多 SO 答案,但我遇到了错误。

这在按日期分组时有效:

Model.group("date(updated_at)").count

然后我尝试了以下几个小时,但没有奏效:

Model.group("hour(updated_at)").count
Model.group("date_format(updated_at, '%H')").count
Model.group("extract(hour from updated_at)").count

一旦我找到了需要更新的特定时间,我将如何获得具有这些时间的模型?即:

Model.where("hour(updated_at) = ?", 5)

【问题讨论】:

    标签: ruby-on-rails postgresql time group-by


    【解决方案1】:

    你可以试试下面的

    Model.group("DATE_PART('hour', updated_at)").count
    

    更新:

    如何查找记录

    Model.where("DATE_PART('hour', updated_at) = ?", 5)
    

    【讨论】:

    • 谢谢,这行得通。你能看看我更新的问题 - 我如何让第二个查询工作?
    • 如果数据库日期时间是UTC,我们如何在这个查询中添加所需的时区。谢谢。
    • 将上面查询中的5 更改为Time.zone.now.utc.hour
    【解决方案2】:

    PostgreSQL 提供了两种方法来提取日期/时间的一部分:

    EXTRACT 是 SQL 标准函数,存在于其他基于 SQL 的数据库中。

    Model.group("EXTRACT(hour FROM created_at)").count
    Model.where("EXTRACT(hour FROM created_at) = ?", 5)
    

    date_part函数

    Model.group("date_part('hour', updated_at)").count
    Model.where("date_part('hour', updated_at) = ?", 5)
    

    官方documentation

    【讨论】:

      【解决方案3】:

      如果你想要日期和小时,你可以使用 date_trunc:

      Model.group("date_trunc('hour', created_at)").count

      如果你想按顺序回答:

      Model.order("date_trunc('hour', created_at)").group("date_trunc('hour', created_at)").count

      是的,很奇怪你不能只做order(:created_at) 但是哦,好吧。

      【讨论】:

        猜你喜欢
        • 2014-01-25
        • 2019-08-19
        • 2015-06-12
        • 1970-01-01
        • 2020-12-16
        • 2013-07-03
        • 2023-01-20
        • 1970-01-01
        • 2020-05-15
        相关资源
        最近更新 更多