4

IはUser/usersテーブル内の2つのdatetimeの列を有します。私は、生年月日が作成日よりも13年も前のユーザーを探したいと思います。日時(PostgreSQLの)

同等のRails if文は((created_at - birthdate) < 13.years)

どのように私はActiveRecordのクエリ(PostgreSQLの上で動作します1)にこれを翻訳しないだろうか?これも可能ですか、または手動ですべてのレコードを繰り返し処理する必要がありますか?

答えて

12

これを行う最も簡単な方法は、intervalを使用することです、それはかなりRailsのバージョンのストレート音訳です:

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

2つのタイムスタンプ(またはタイムスタンプと日付)との間の差でありますあなたの比較の右側に適切な値が必要なだけです。

+1

動作します。ありがとうございました!これを読んだ人のためのメモ: 'interval'はSQLiteでは動作しません。私はそれをテストするためにPostgreSQLを使って私のプロダクションサーバにログインしなければなりませんでした。 – LouieGeetoo

+5

@LouieGeetoo:あなたは本当に異なるスタック上で開発して展開するべきではありません。日付の算術とのわずかな構文の違いは、あなたの問題の中で最も少なくなるでしょう。 –

-1

あなたは、単にあなたのwhere句内のPostgreSQLの構文でそれを策定する必要があります。

MySQLの場合、これはdatediff機能を使用して、次のようになります。

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

13 * 356は、DATEDIFFは、日中の違いを返しますので、日に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ので同様だと思います。

+1

あなたは、閏年の問題を抱えています。 –

+0

人生はうるう年の問題のために短すぎる:D ..私はちょうどそれが365日が年間であること.. – Tigraine

+1

閏年はさておき、それは一般的に受け入れられている問題の多くではないのです想定し、いない356;)ありがとうとにかく答え。 – LouieGeetoo