ruby-on-rails - 使用 Rails 3.1 ActiveRecord 查询查找年度日期

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

我正在构建一个 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/

相关文章:

sql - 具有非零基数的多对多关系

java - Openshift Postgresql 连接错误 :

ruby-on-rails - 检查多插入事务是否成功

ruby-on-rails - 如何自定义 Rails 4 render() 查找文件的方式?

ruby-on-rails - 选择所有复选框

ruby-on-rails - CloudFront 不加载我的 Font Awesome rails 4

ruby-on-rails - 如何禁用 Rails 4 中的部分更新?

ruby-on-rails - Omniauth:回调未触发,返回 "invalid credentials"失败

python - 如何从 Django 模型中为模型字段定义 json 类型

sql - 什么时候放弃事件记录?