阶段:
我有这个模型:
Promo(id: integer, start_date: datetime, end_date: datetime)
我想知道目前有哪些促销活动。可能我们的查询应该是这样的:
SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;
问题:
我应该如何在 Ruby 中制作它?哪个是正确的方法?
谢谢你。
阶段:
我有这个模型:
Promo(id: integer, start_date: datetime, end_date: datetime)
我想知道目前有哪些促销活动。可能我们的查询应该是这样的:
SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;
问题:
我应该如何在 Ruby 中制作它?哪个是正确的方法?
谢谢你。
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 上。
尚未对此进行测试,但请尝试以下操作:
currentTime = Time.now()
Promo.find(
:all,
:conditions => ['start_date < ? AND end_date > ?', currentTime, currentTime]
)
Date
如果Time
课程不起作用,您可能需要使用该课程
是的,您可以使用比较运算符来比较日期,例如:
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
我希望这有帮助。