使用Rails 3.1 ActiveRecord查询查找年度日期

时间:2011-12-06 19:44:26

标签: ruby-on-rails postgresql activerecord ruby-on-rails-3.1

我正在构建一个Rails 3.1项目,其中我的一个模型包含一个birthday属性。我一直试图找到一个查询,基本上找到生日在一定范围内的所有用户。问题是这部分应用程序并不真正关心出生年份,只关注月份和日期。不幸的是,谷歌在这方面没有太多帮助。

有谁知道如何在特定日期范围内查询生日属性“有周年纪念日”的所有记录?我希望这是有道理的!

2 个答案:

答案 0 :(得分:5)

听起来像是在寻找EXTRACT

M.where(%q{
    array[extract(month from d)::int, extract(day from d)::int] between array[?, ?] and array[?, ?]
}, lower_month, lower_day, upper_month, upper_day)

其中M是您的模型,bday是生日列,上下变量包含月和日边界。您也可以使用INTERSECT

M.find_by_sql([%q{
    select * from ms where array[? ,?] <= array[extract(month from bday)::int, extract(day from bday)::int]
    intersect
    select * from ms where array[?, ?] >= array[extract(month from bday)::int, extract(day from bday)::int]
}, lower_month, lower_day, upper_month, upper_day])

另一个版本将使用to_char

M.where(
    "to_char(bday, 'MM') || to_char(bday, 'DD') between ? and ?",
    '%2.2d%2.2d' % [lower_month, lower_day],
    '%2.2d%2.2d' % [upper_month, upper_day]
)

你也可以用一大堆CASE语句得到相同的结果(所以你只考虑月边界的日期)但是交叉点(IMO)更清洁,更容易阅读。使用(PostgreSQL)数组允许您将月/日对彼此作为单个单元进行比较,而不是单独进行比较。

答案 1 :(得分:0)

sql中有各种日期函数。其中一些只是拉出日/月(独立于一年)。我很确定有一个只返回“一年中的某一天”(即1到365)(如果没有你可以写一个) - 在这种情况下你可以使用它并抓住所有拥有它们的行你现在手里拿着的一小段日子里的一天。