【发布时间】:2011-08-04 14:13:39
【问题描述】:
我有一个包含数百条记录的表,每条记录都包含一个日期时间列。从该日期时间字段中找到不同年份的最有效方法是什么?
【问题讨论】:
标签: ruby-on-rails-3 activerecord
我有一个包含数百条记录的表,每条记录都包含一个日期时间列。从该日期时间字段中找到不同年份的最有效方法是什么?
【问题讨论】:
标签: ruby-on-rails-3 activerecord
使用 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)")
【讨论】:
SELECT DISTINCT(YEAR(created_at)) FROM your_table
可能会起作用,但很大程度上取决于您使用的数据库(这当然适用于 MySQL)。
ActiveRecord 如果你想使用自定义 SQL 语句,使用像
Model.all.map(&:created_at).map(&:year).uniq
确实更漂亮,虽然它可能会因为加载和迭代所有记录而变得非常慢。
【讨论】:
这将直接从 PostgreSQL 的数据库中返回一个年份数组:
YourModel.pluck("DISTINCT EXTRACT(YEAR FROM my_datetime)::Integer")
【讨论】:
这将返回数组中的唯一年份:
years = Model.pluck(:created_at).map{|x| x.year}.uniq
【讨论】:
使用 Postgres,您可以:
SELECT distinct(EXTTRACT(YEAR from date)) from DataTable;
【讨论】: