Rails 3.2中的日期比较

时间:2012-10-25 21:18:19

标签: 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中制作它? 哪种方法正确?

谢谢。

3 个答案:

答案 0 :(得分:2)

Rails很聪明。如果检索日期/时间,它将转换为DateTime对象。 相反,将DateTime对象传递给where子句(对于Rails 3.x),它将正确构建where子句。

传递给where子句的字符串将传递给SQL where子句。如果你传递一个数组, 第二个和后面的元素将替换为'?'第一个元素中的字符。

所以,对于你的情况:

Promo.where(["? between start_date and end_date", DateTime.now])

的工作原理。我验证了我的Rails模型(位置)碰巧有start_date和end_date,并且工作正常:

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

使用PostgreSQL在Rails 3.2.8上。

答案 1 :(得分:0)

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

irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true

但是你想把日期与日期时间进行比较吗?

如果是这种情况,您需要将日期时间转换为日期,然后进行比较。

Date.parse('2010-11-01') < Date.today
如果'2010-11-01'已经过了

将返回true

我希望这会有所帮助。

答案 2 :(得分:0)

没有测试过这个,但尝试类似:

currentTime = Time.now()
Promo.find(
     :all,
     :conditions => ['start_date < ? AND end_date > ?', currentTime, currentTime]
)

如果Date类不起作用,您可能需要使用Time