使用活动记录按月和日查找记录,忽略年份和时间

时间:2011-08-18 03:23:05

标签: ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord

我有一个模型(条目),有五年的记录(每天一条记录)。我需要一个方法,当传递一个日期对象(例如2011-12-25 00:00:00)时,将向我显示12/25发生的所有记录(查询:created_at列),无论年份或时间如何那已经过去了。

RoR 3.0.9 / Ruby 1.9.2p290

4 个答案:

答案 0 :(得分:12)

您可以使用mysql的MONTH和DAY值。也许是这样的:

Model.where("MONTH(created_at) = ? and DAY(created_at) = ?", somedate.month, somedate.day)

答案 1 :(得分:10)

适用于大多数SQL数据库(包括MySQL和PostgreSQL)的通用解决方案:

Entry.where('extract(month from created_at) = ? AND extract(day from created_at) = ?', d.month, d.day)

SQLite不理解extract,所以你必须使用:

Entry.where("strftime('%m/%d', created_at) = ?", d.strftime('%m/%d'))

答案 2 :(得分:2)

假设您使用的是mysql:

User.where(["DAY(created_at) = ? AND MONTH(created_at) = ?", date.day, date.month])

答案 3 :(得分:2)

假设RDBMS是MySQL并且你有使用combobox的表单来选择month和/或date_of_months,可能你可以创建一个named_scope,例如:

scope :by_date_or_month, lambda { |date, month| {:conditions => ["DAYOFMONTH(created_at) = ? or MONTH(created_at) = ?", date, month]}}

来自IRB的测试:

Model.by_date_or_month(31,8)
Model.by_date_or_month(nil,8)