首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Rails 3.2中的日期比较

Rails 3.2中的日期比较
EN

Stack Overflow用户
提问于 2012-10-25 21:18:19
回答 3查看 1.2K关注 0票数 0

阶段

我有这样的模型:

代码语言:javascript
代码运行次数:0
运行
复制
Promo(id: integer, start_date: datetime, end_date: datetime)

我想知道目前的促销活动是什么。可能是我们的查询应该是:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;

问题

我该怎么用Ruby做呢?哪种方法是正确的?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2012-10-26 05:48:40

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

传递给where子句的字符串将传递给SQL子句。如果您传递一个数组,第二个和更高版本的元素将被替换为“?”第一个元素中的字符。

所以,对于你的案子:

代码语言:javascript
代码运行次数:0
运行
复制
Promo.where(["? between start_date and end_date", DateTime.now])

很管用。我在我的Rails模型(位置)上进行了验证,该模型恰好具有start_date和end_date,并且工作正常:

代码语言:javascript
代码运行次数:0
运行
复制
[1] pry(main)> Position.where(["? between start_date and end_date", DateTime.now]).count
=> 2914

它在Rails 3.2.8中使用PostgreSQL。

票数 2
EN

Stack Overflow用户

发布于 2012-10-26 04:43:45

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

代码语言:javascript
代码运行次数:0
运行
复制
irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true

但你是想把约会比作约会时间吗?

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

代码语言:javascript
代码运行次数:0
运行
复制
Date.parse('2010-11-01') < Date.today

如果“2010-11-01”已经通过,将返回true。

我希望这能帮到你。

票数 0
EN

Stack Overflow用户

发布于 2012-10-26 04:56:23

尚未对此进行测试,但请尝试如下:

代码语言:javascript
代码运行次数:0
运行
复制
currentTime = Time.now()
Promo.find(
     :all,
     :conditions => ['start_date < ? AND end_date > ?', currentTime, currentTime]
)

如果Date类不能工作,则可能需要使用Time

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13077439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档