【问题标题】:Rails where date is greater than given date query日期大于给定日期查询的Rails
【发布时间】:2011-11-24 21:04:08
【问题描述】:

尝试搜索上映日期早于今天的电影的上映日期

 Movie.where('release > ?', Date.today)
ActiveRecord::StatementInvalid: Mysql::ParseError: You have an error in your SQL     syntax;    check the manual that corresponds to your MySQL server version for the right syntax to use near 'release > '2011-09-25')' at line 1: SELECT `movies`.* FROM `movies` WHERE (release > '2011-09-25')

【问题讨论】:

标签: sql ruby-on-rails-3


【解决方案1】:

Rails 3+:

Movie.where('release > ?', DateTime.now)

Pre Rails 3

Movie.where(['release > ?', DateTime.now])

【讨论】:

  • 您不再需要数组语法了。导轨 3、4 :)
  • 请详细说明@oma
  • @AdamWaite,表示 Q 中的语法对于较新的版本实际上是正确的
  • 请注意,如果您的查询参数是 Date 而不是 DateTime,那么您可能需要在参数上调用 .to_time。这将考虑到您的 Rails Time.zone(例如 UTC-5)和您的数据库时区(应该是 UTC)之间的共同差异。所以你的查询看起来像:Movie.where('release > ?', my_date.to_time)。另外:您可以使用以下方式查看您的 Postgres 时区:show timezone;
【解决方案2】:

在最新版本的 Rails 中,您可以这样做:

User.where(created_at: 3.days.ago..Time.now)

在此处查看其他示例:https://stackoverflow.com/a/24150094

【讨论】:

  • 这真的很好@Patrick。 FWIW 如果您想要一个专有 日期范围,请在该范围内添加第三个点,即User.where(created_at: 3.days.ago...Time.now),它会按您的预期工作。
  • 您也可以使用User.where(created_at: ..Time.now) 使下限不受限制。 IE。它会找到任何在 Time.now 之前创建的东西。
【解决方案3】:

更新

Rails 核心团队决定暂时恢复此更改,以便更详细地讨论它。请参阅this comment 和this PR 了解更多信息。

我仅出于教育目的而留下我的答案。


Rails 6.1 中用于比较的新“语法”(已还原)

Movie.where('release >': DateTime.now)

这里是a link to PR,您可以在其中找到更多示例。

【讨论】:

  • 感谢您继续关注。尽管它已被还原(尚未合并),但我仍然觉得它很酷且超级有趣。
【解决方案4】:

在 Ruby 2.7 中,你可以试试这个:

License.where(expiration: Time.zone.today..)
SELECT "licenses".* FROM "licenses" WHERE "licenses"."expiration" >= '2021-07-06 15:12:05'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多