我在datetime
/ User
表格中有两个users
列:created_at
和birthdate
。我想找到生日日期不到13年的用户。
等效的Rails if
语句为((created_at - birthdate) < 13.years)
如何将其转换为ActiveRecord查询(可以在PostgreSQL上运行)?这是可能的,还是我必须手动迭代所有记录?
答案 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中很相似。