And*_*rew 3 postgresql activerecord ruby-on-rails ruby-on-rails-3.1
我正在构建一个Rails 3.1项目,其中我的一个模型包含一个生日属性.我一直试图找到一个查询,基本上找到生日在一定范围内的所有用户.问题是这部分应用程序并不真正关心出生年份,只关注月份和日期.不幸的是,谷歌在这方面没有太多帮助.
有谁知道如何在特定日期范围内查询生日属性"有周年纪念日"的所有记录?我希望这是有道理的!
听起来像是在寻找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)
Run Code Online (Sandbox Code Playgroud)
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])
Run Code Online (Sandbox Code Playgroud)
另一个版本将使用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]
)
Run Code Online (Sandbox Code Playgroud)
你也可以用一大堆CASE语句获得相同的结果(这样你只考虑月边界的日期),但交叉点(IMO)更清晰,更容易阅读.使用(PostgreSQL)数组允许您将月/日对彼此作为单个单元进行比较,而不是单独进行比较.
| 归档时间: |
|
| 查看次数: |
543 次 |
| 最近记录: |