ActiveRecord查询中的DateTime算法(PostgreSQL)

时间:2012-04-24 15:46:51

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

我在datetime / User表格中有两个users列:created_atbirthdate。我想找到生日日期不到13年的用户。

等效的Rails if语句为((created_at - birthdate) < 13.years)

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

2 个答案:

答案 0 :(得分:12)

最简单的方法是使用interval,然后它几乎是Rails版本的直接音译:

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

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

答案 1 :(得分:-1)

你只需要在where子句中的PostgreSQL语法中进行表达。

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

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

13 * 356表示自dateiff返回天数差异后的3天内。

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

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中很相似。