Rails`where`的时间少于查询

时间:2014-05-29 14:51:04

标签: mysql sql ruby-on-rails date arel

设置

Rails'where方法可以在哈希中使用范围来生成将搜索范围内的值的查询。例如:

User.where(cash_money: 10..1000)
#=> SELECT `users`.* FROM `users`  WHERE (`users`.`cash_money` BETWEEN 10 AND 1000)

这也可以与

等时间戳一起使用
User.where(last_deposit: 10.days.ago..1000.days.ago)
#=> SELECT `users`.* FROM `users`  WHERE (`users`.`last_deposit` BETWEEN '2014-05-19 14:42:36' AND '2011-09-02 14:42:36')

我发现你可以使用像这样的哈希语法做一个小于或大于数字的简单

User.where(cash_money: 10..Float::INFINITY)
#=> SELECT `users`.* FROM `users`  WHERE (`users`.`cash_money` >= 10)

并且-Float::INFINITY可以使用SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2014-05-19 14:42:36') 进行相同的操作。

问题

有没有办法用时间戳来做这个,所以我可以得到如下的查询?

Float::INFINITY

我无法将Date::InfinityArgumentError: bad value for range与范围一起使用,因为它们都与User.where('`users`.`last_deposit` >= ?', 10.days.ago) 错误。

当前简单解决方案

Time.at(0)

将生成相同的SQL,但如果可以使用字符串以外的对象完成,我想这样做。

潜力(Meh)回答

这有点糟糕但可以使用Time.at(Float::MAX)和{{1}}的范围来完成。我觉得这些可能导致同样糟糕的SQL查询。

4 个答案:

答案 0 :(得分:12)

修改

现在可以在Rails 5中使用了!

User.where(last_deposit: 10.days.ago..DateTime::Infinity.new)

将生成SQL

SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2018-06-30 17:08:54.130085').

原始(和Rails< 5)回答

似乎没有办法使用基本的where哈希语法来生成大于或小于时间戳的查询。我在Current Simple Solution下的问题中概述了最简单,最易阅读的方式。

另一种方法是使用ARel,但你必须做一些不那么常见的调用。首先,您可以获得AR类的处理能力。 ARel表,访问该列,传递大于gt,大于或等于gteq,小于lt和/或小于或等于{{1}的结果带有lteq参数的方法。

在上面的情况中,这将完成如下:

where

答案 1 :(得分:9)

你试过这个吗?:

User.where(last_deposit: Time.at(0)...10.days.ago)

SQL:

SELECT `users`.* FROM `users`  WHERE (`users`.`last_deposit` >= '1970-01-01 00:00:00' AND `users`.`last_deposit` < '2015-01-10 17:15:19')

答案 2 :(得分:0)

您需要使用适当的无穷大。时间戳是DateTime而不是Date。使用DateTime::Infinity.new代替DateTime::Infinity.new(-1)代替负无限。

相关:Is there a way to express 'Infinite Time' in Ruby?

答案 3 :(得分:-1)

试试这个:

User.where(last_deposit.gt(10.days.ago))