Activerecord Rails 3.2中的日期比较

Activerecord Rails 3.2中的日期比较,activerecord,ruby-on-rails-3.2,active-record-query,Activerecord,Ruby On Rails 3.2,Active Record Query,舞台: 我有这个模型: Promo(id: integer, start_date: datetime, end_date: datetime) 我想知道目前哪些促销活动。 可能我们的查询应该是这样的: SELECT * FROM promos WHERE now BETWEEN start_date AND end_date; 问题: 我应该如何用Ruby制作? 哪种方法正确 谢谢。是的,您可以使用比较运算符来比较日期,例如: irb(main):018:0> yesterday =

舞台

我有这个模型:

Promo(id: integer, start_date: datetime, end_date: datetime)
我想知道目前哪些促销活动。 可能我们的查询应该是这样的:

SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;
问题

我应该如何用Ruby制作? 哪种方法正确


谢谢。

是的,您可以使用比较运算符来比较日期,例如:

irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true
irb(main):018:0>Date=Date.new(2009,6,13)
=> #
irb(主要):019:0>日期.今天>昨天
=>正确
但是你是在试着比较一个日期和一个日期时间吗

如果是这样的话,您需要将datetime转换为日期,然后进行比较

Date.parse('2010-11-01')
如果已通过“2010-11-01”,则将返回true


我希望这能有所帮助。

还没有测试过这一点,但请尝试以下方法:

currentTime = Time.now()
Promo.find(
     :all,
     :conditions => ['start_date < ? AND end_date > ?', currentTime, currentTime]
)
currentTime=Time.now()
宣传片(
:全部,
:条件=>[“开始日期<和结束日期>”,当前时间,当前时间]
)

如果
Time
类不起作用,您可能需要使用
Date
类。如果检索日期/时间,它将转换为DateTime对象。 相反,将DateTime对象传递给where子句(对于Rails 3.x),它将正确地构建where子句

传递给where子句的字符串将传递给SQLWHERE子句。如果传递一个数组, 第二个和以后的元素将替换为第一个元素中的“?”字符

因此,对于您的情况:

Promo.where(["? between start_date and end_date", DateTime.now])
工作。我在我的Rails模型(位置)上进行了验证,该模型碰巧有开始日期和结束日期,并且工作正常:

[1] pry(main)> Position.where(["? between start_date and end_date", DateTime.now]).count
=> 2914

它位于PostgreSQL的Rails 3.2.8上。

任何人回答对你有帮助的问题,然后接受这个答案
[1] pry(main)> Position.where(["? between start_date and end_date", DateTime.now]).count
=> 2914