我有一个包含数百条记录的表,每条记录都包含一个日期时间列。从该日期时间字段中找到不同年份的最有效方法是什么?
答案 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;