如何在Rails中查找具有多年的表的不同年份

时间:2011-08-04 14:13:39

标签: ruby-on-rails-3 activerecord

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

5 个答案:

答案 0 :(得分:12)

使用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)")

答案 1 :(得分:1)

SELECT DISTINCT(YEAR(created_at)) FROM your_table

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

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

这样的Ruby语句,那么

ActiveRecord会很痛苦

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

确实是美,但由于加载和迭代所有记录,它确实很慢。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

使用 Postgres,您可以:

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