【问题标题】:Comparing created_at fields with PGSQL on Rails将 created_at 字段与 Rails 上的 PGSQL 进行比较
【发布时间】:2012-01-14 12:14:25
【问题描述】:

我的问题有点像在这里找到的问题:

How to compare sqlite TIMESTAMP values

除了答案不适用于 PostgreSQL。有什么方法可以将 Rails 生成的两个 created_at 值与 PG 函数进行比较?

这是我想做的(我知道这不起作用,DATETIME 对 PG 不起作用):

EventDish.find_by_sql(["select * from ............. and DATETIME(events.created_at) < ?", other_event.created_at])

添加省略号以突出显示重要部分。换句话说,我想比较两个 Rails created_at 字段(它们使用默认值),但我想将它们与 PG 进行比较。有什么建议? (我一般对 SQL 不太熟悉,所以任何纯 Rails 解决方案也将不胜感激)

提前致谢

【问题讨论】:

  • 您是否收到 postgresql 错误?你通常可以直接在sql中将postgresql时间戳值与字符串进行比较,postgresql会将字符串隐式转换为时间戳以进行转换。

标签: ruby-on-rails ruby-on-rails-3 postgresql


【解决方案1】:

直接跳过 DATETIME() 函数:

EventDish.find_by_sql(['select * from event_dish where created_at > ?', other_event.created_at])

【讨论】:

    【解决方案2】:

    你应该能够做到:

    EventDish.where('created_at < ?', other_event.created_at)
    

    这转化为:

    "SELECT \"event_dishes\".* FROM \"event_dishes\" WHERE (created_at < '2011-06-10 16:39:19.557436')"
    

    除非你真的需要做一些复杂的查询,否则我个人会远离使用find_by_sql。如果可以,请保持简单,让 ActiveRecord 为您完成工作。

    如果您无法避免使用find_by_sql,那么只需将您当前的查询更新为:

    EventDish.find_by_sql(["select * from ............. WHERE (created_at < '#{other_event.created_at}')")
    

    【讨论】:

    • 问题是它是一个相当复杂的查询......我不能在这里完整地发布它。我试过做 event.created_at
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多