【问题标题】:How do I compare dates in rails without the year?如何在没有年份的情况下比较 Rails 中的日期?
【发布时间】:2011-09-10 10:37:31
【问题描述】:

我正在尝试查找未来 2 周内所有生日的用户。

我尝试了以下方法:

User.find(:all, :conditions => ["DOB > ? and DOB <= ?", Date.today, 2.weeks.from_now])

这显然行不通,因为 DOB 中的“年份”不等于今年。

我只需要比较月份和日期。

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails date compare


    【解决方案1】:

    你必须在你的 dob 列上执行 mysql 方法

    类似以下的东西

      SELECT FROM users  
             WHERE DAYOFYEAR(dob)in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
    

    您可以使用 WEEK 之类的函数,无论哪个对您有用 Ref this 用于 mysql 函数

    在红宝石中

    arr=[]
    (0..13).each{|i| arr << (Date.today+i.day).day }
    User.find(:all, :conditions => ["DAYOFYEAR(DOB) in (?)", arr])
    

    【讨论】:

      【解决方案2】:

      根据 Salil 的回答,我得出以下结论以使其适用于 sqlite:

      arr = []
      (0..14).each { |i| arr << (Date.today + i.day).yday }
      @users = User.find(:all, :conditions => ["cast(strftime('%j', DOB) AS int) in (?)", arr])
      

      【讨论】:

        【解决方案3】:

        这可能有助于更改日期格式以进行比较,因为默认情况下它将采用 Date.today.year。

                      Date.strptime("{ #{DOB.month}, #{DOB.date} }", "{ %m, %d }").
        

        Date.strptime("{ 9, 10 }", "{ %m, %d }") 给出

        <Date: 2011-09-10 (4911629/2,0,2299161)>
        

        如果你得到一些直接比较的代码,请发布。

        【讨论】:

        • 是否有 SQL 方法来做同样的事情?因为我不能只将 ruby​​ 代码粘贴到我的条件中
        【解决方案4】:

        postgresql 的另一种方法:

        scope :with_bday, -> (from, to) {
            where("EXTRACT(DOY FROM birthday)::int BETWEEN ? AND ?", *[
                from.yday,
                to.yday
            ])
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多