如何在Rails中使用可变日期搜索日期范围

13

我该如何在Rails的Active Record中实现这个功能?

查找在本月之间(created_at + 100 天)创建的所有模型。

编辑: 好的,抱歉之前没有表述清楚。我想在Rails 3.0的Active Record中实现这个功能。

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())

我想使用Active Record来编写一个类似的查询,但是使用where条件。

4个回答

53

在Rails 3中,您可以使用:

YourModel.where(:created_at => start_date..end_date)

其中start_dateend_date都是Date类。


2
这不包括在 end_date 上为我创建的任何记录。 - ckarbass
3
是的,我认为这是因为没有时间的日期会被解释为那一天的午夜,因此,在该日期的任何时间都被视为超出范围。所以,是的,需要再加一天。 - adamwong246
2
使用 .. 生成的区间不包括最后一项,但使用 ... 应该包括。尝试使用 start_date...end_date 看看是否可以正常工作。 - Fredrik Bränström
2
@FredrikBränström 实际上相反,.. 包含起始和结束值,... 排除结束值。问题可能是像其他人提到的那样,需要使用 end_date.end_of_dayend_date + 1 - d3vkit
哦,抱歉。这不是很直观...是吗? - Fredrik Bränström

11

ActiveRecord可以使用Range来构建一个BETWEEN查询。这听起来可能更符合您的需求。

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

与在查询中使用>= <=相比,这似乎总是更简单一些。


9

您没有指定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] }}

在Rails 3中,您可以使用新的Arel作用域方法和scope
scope :within_range, lambda { where("created_at <= ? AND created_at >= ?", Date.today + 100, Date.today - 100) }

1
如果我理解正确,你需要类似这样的东西:
date = Date.today
after = date.start_of_month - 100
before = date.end_of_month - 100

YourModel.find(:all, :conditions => ['created_at > ? AND created_at < ?', after, before])

或在作用域内(Rails 2):

# shorter name is needed
named_scope :created_100_days_before_this_month, lambda do |date|
  after = date.start_of_month - 100
  before = date.end_of_month - 100
  YourModel.find(:all, :conditions => ['created_at > ? AND created_at < ?', after, before])
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接