【问题标题】:How to find distinct years from a table with multiple years in Rails如何从 Rails 中的多年表中找到不同的年份
【发布时间】:2011-08-04 14:13:39
【问题描述】:

我有一个包含数百条记录的表,每条记录都包含一个日期时间列。从该日期时间字段中找到不同年份的最有效方法是什么?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

    使用 Ruby(不过,这需要加载所有记录):

    Model.select("my_datetime").map{ |item| item.my_datetime.year }.uniq
    

    使用 SQL(此示例适用于 PostgreSQL,我可以使用您的特定数据库对其进行更新):

    # PostgreSQL
    Model.select("distinct(extract(year from my_datetime))")
    
    # MySQL
    Model.select("distinct(year(my_datetime))")
    
    # SQLite
    Model.select("strftime('%Y', my_datetime)")
    

    【讨论】:

      【解决方案2】:
      SELECT DISTINCT(YEAR(created_at)) FROM your_table
      

      可能会起作用,但很大程度上取决于您使用的数据库(这当然适用于 MySQL)。

      ActiveRecord 如果你想使用自定义 SQL 语句,使用像

      Model.all.map(&:created_at).map(&:year).uniq
      

      确实更漂亮,虽然它可能会因为加载和迭代所有记录而变得非常慢。

      【讨论】:

        【解决方案3】:

        这将直接从 PostgreSQL 的数据库中返回一个年份数组:

        YourModel.pluck("DISTINCT EXTRACT(YEAR FROM my_datetime)::Integer")
        

        【讨论】:

          【解决方案4】:

          这将返回数组中的唯一年份:

          years = Model.pluck(:created_at).map{|x| x.year}.uniq

          【讨论】:

            【解决方案5】:

            使用 Postgres,您可以:

            SELECT distinct(EXTTRACT(YEAR from date)) from DataTable;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-12-04
              • 2021-11-18
              • 1970-01-01
              相关资源
              最近更新 更多