如何在具有可变日期的Rails中搜索日期范围

Gia*_*rzo 12 activerecord ruby-on-rails date

我怎么能在rails active record中做到这一点?

找到所有匹配的模型(created_at +本月之间的100天)

编辑:好的,对不起,这不是我在Rails 3.0中的活动记录中尝试做的事情:

select 
    distinct p.ID 
from
    patients p
    inner join vaccines_patients vp on p.ID = vp.patient_id
    inner join vaccines v on v.ID = vp.VACCINE_ID
where
    month(vp.appliedAt + INTERVAL v.duration DAY) = month(now())
Run Code Online (Sandbox Code Playgroud)

我想得到一个类似的查询,但使用活动记录中的位置.

Cri*_*jon 50

在Rails 3中,您可以使用:

YourModel.where(:created_at => start_date..end_date)
Run Code Online (Sandbox Code Playgroud)

其中start_dateend_date是Date类.

  • 这不包括在end_date上为我创建的任何记录. (2认同)
  • 是的,我认为这是因为没有时间的日期被解释为当天的午夜,因此,在该日期期间的任何时间都被视为超出范围.所以是的,再加一天. (2认同)
  • 带...的范围不包括最后一项,但是......应该.尝试start_date ... end_date,看看是否有效 (2认同)
  • @FredrikBränström实际上它是相反的,`..`开始以包含的方式结束,`...`排除了最终值.这个问题很可能像其他人提到的那样,需要是`end_date.end_of_day`或`end_date + 1`.资料来源:http://ruby-doc.org/core-2.3.1/Range.html (2认同)

Mat*_*ito 10

ActiveRecord可以使用BETWEEN何时接受a 来构建查询Range.这听起来可能更像你正在寻找的东西.

YourModel.where(created_at: 100.days.ago..100.days.from_now)

这样做总比>= <=在查询中使用要简单一些


jdl*_*jdl 7

你没有指定Rails 2或3,我不完全确定你实际想要的范围,但这应该让你开始.请添加一些示例日期,并说明它们是否应该属于您的范围.

在Rails 2中,您可以在模型中使用named_scope.

# This range represents "created_at" values that are within 100 days on either side of today.
# Please clarify what "created_at + 100 days between this month" means if you need help
# refining this.
#
named_scope :within_range, lambda {{ :conditions => ["created_at <= ? AND created_at >= ?", Date.today + 100, Date.today - 100] }}
Run Code Online (Sandbox Code Playgroud)

在Rails 3中,您将使用scope新的Arel范围方法:

scope :within_range, lambda { where("created_at <= ? AND created_at >= ?", Date.today + 100, Date.today - 100) }
Run Code Online (Sandbox Code Playgroud)