【问题标题】:Finding annual dates with Rails 3.1 ActiveRecord Queries使用 Rails 3.1 ActiveRecord 查询查找年度日期
【发布时间】:2011-12-06 19:44:26
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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)
    

    其中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) 数组,您可以将月/日对作为单个单位而不是单独进行比较。

    【讨论】:

    • 太棒了。我只测试了几条记录,之前的查询似乎有效,但现在我可以看到那个查询会在哪里给出不正确的结果。非常感谢!我不是 SQL 专家,所以在这类事情上我总是需要帮助。
    • @Andrew:我最初犯了你可能犯的同样的错误,我应该擅长这些东西 :) 基于有限的数据集推断查询充满危险,这就是为什么我们检查彼此的工作。
    • 这是否可以跨月工作(例如,10/31-11/4)?例如,当我针对 10/31 运行查询的第一部分时,它只选取 31 日或之后发生的生日(即只有 31 天的月份,而不是 11/1、11/2 等)。因此,即使我在那个时间范围之间有生日,我的交叉点也会一直显示为“0”。此外,当我加载此答案中所写的查询时,我从 Rails 控制台收到“错误数量的参数(5 代表 2)”。
    • @JHo:find_by_sql 调用中缺少一些括号,对此感到抱歉。我认为你对边缘案例的看法可能是对的,我会再次考虑这个问题,今晚再回复你。
    • @JHo:你是对的,感谢您指出脑损伤。我更新了一些更好的选择,希望能减少脑损伤。
    【解决方案2】:

    sql中有各种日期函数。其中一些只是拉出日/月(独立于年份)。我很确定有一个只返回“一年中的某一天”(即 1 到 365)(如果没有,你可以写一个)——在这种情况下,你可以使用它并抓取所有有它们的行一年中的某一天,与您现在手头的日期相差很小。

    【讨论】:

    • 不过,extract(doy from bday) 可能会遇到闰年问题,最好分别考虑月份和月份。
    • 太棒了。我最终使用了 extract 并分别考虑月份和日期,它的工作就像一个魅力!
    • @Andrew:你确定它像魅力一样工作吗?当月数等于上月或下月时,您应该只查看月份中的日期(我承认我在最初的尝试中犯了这个错误)。
    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多