4

我在/表中有两datetime列:和. 我想查找其出生日期在创建日期前不到 13 年的用户。Useruserscreated_atbirthdate

等效的 Railsif语句将是((created_at - birthdate) < 13.years)

如何将其转换为 ActiveRecord 查询(可以在 PostgreSQL 上运行的查询)?这甚至可能吗,还是我必须手动遍历所有记录?

4

2 回答 2

12

最简单的方法是使用间隔,那么它几乎是 Rails 版本的直接音译:

User.where(%q{created_at - birthdate < interval '13 years'})

两个时间戳(或时间戳和日期)之间的差异是一个间隔,因此您只需要比较右侧的适当值。

于 2012-04-24T18:04:10.727 回答
0

你只需要在你的 where 子句中用 PostgreSQL 语法来表述它。

对于 MySQL,这看起来与使用datediff函数类似:

User.where("DATEDIFF(created_at, birthdate) > (13 * 365)")

13*356 代表 3 年的天数,因为 datediff 返回天数差异。

然后,我会将其封装在类似作用域的函数中,如下所示:

class User < ActiveRecord::Model
  def self.age_difference(years)
    where("DATEDIFF(created_at, birthdate) > (? * 365)", years)
  end
end

所以你可以这样称呼它:

User.age_difference(13).each do |user|
  puts user.inspect
end

我想它在 Postgres 中是相似的。

于 2012-04-24T16:00:30.707 回答