我正在构建一个 Rails 3.1 项目,其中我的模型之一包含生日属性。我一直在尝试找到一个查询,该查询本质上可以找到生日在特定范围内的所有用户。问题是应用程序的这一部分并不真正关心出生年份,只关心月份和日期。不幸的是,Google 在这方面并没有提供太多帮助。
有谁知道如何查询某个日期范围内生日属性为“有周年纪念日”的所有记录吗?我希望这是有道理的!
最佳答案
听起来您正在寻找 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) 数组允许您将月/日对作为单个单位而不是单独进行比较。
关于ruby-on-rails - 使用 Rails 3.1 ActiveRecord 查询查找年度日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8405793/