阶段:
我有这个型号:
Promo(id: integer, start_date: datetime, end_date: datetime)
我想知道目前的促销活动。 可能是我们的查询应该是:
SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;
问题:
我应该如何在Ruby中制作它? 哪种方法正确?
谢谢。
答案 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
类