2011-12-06 14 views
3

私のモデルの1つに誕生日属性が含まれているRails 3.1プロジェクトをビルドしています。私は基本的に特定の範囲内の誕生日を持つすべてのユーザーを検索するクエリを検索しようとしています。問題は、アプリケーションのこの部分が実際に月日だけの生年を気にしないことです。残念ながら、Googleはこれについて多くの助けをしていません。Rails 3.1 ActiveRecordのクエリで年間日付を見つける

特定の日付範囲内に誕生日属性が「記念日を持つ」すべてのレコードを照会する方法を知っている人はいますか?私はそれが理にかなったことを願う

答えて

5

はサウンド:

Mは、あなたのモデルである
M.where(%q{ 
    array[extract(month from d)::int, extract(day from d)::int] between array[?, ?] and array[?, ?] 
}, lower_month, lower_day, upper_month, upper_day) 

bdayは、誕生日のコラムで、上下の変数は、月と日の境界を保持します。またINTERSECTを使用することができます。

M.find_by_sql([%q{ 
    select * from ms where array[? ,?] <= array[extract(month from bday)::int, extract(day from bday)::int] 
    intersect 
    select * from ms where array[?, ?] >= array[extract(month from bday)::int, extract(day from bday)::int] 
}, lower_month, lower_day, upper_month, upper_day]) 

さらに別のバージョンがto_charを使用します。

M.where(
    "to_char(bday, 'MM') || to_char(bday, 'DD') between ? and ?", 
    '%2.2d%2.2d' % [lower_month, lower_day], 
    '%2.2d%2.2d' % [upper_month, upper_day] 
) 

あなただけ検討したいようにするにはあまりにもCASE文(の大きな醜い山と同じ結果を得ることができます月の月の日)、交差点は(IMO)クリーナーで読みやすくなります。 (PostgreSQL)配列を使用すると、月/日のペアを別々にではなく単一の単位として互いに比較することができます。

+0

素晴らしい。私はいくつかのレコードでテストしていましたが、以前のクエリはうまくいくように見えましたが、今どこで誤った結果が出るかわかります。どうもありがとうございます!私はSQLの専門家ではないので、私はいつもこのようなことについて助けが必要です。 – Andrew

+0

@Andrew:もともと私はおそらくあなたと同じ間違いを犯しました。私はこのことをうまくやっています:)限られたデータセットに基づいてクエリを推論することは危険に満ちているので、お互いの仕事をチェックするのです。 –

+1

これは数か月(たとえば10/31-11/4)にわたって機能しますか?たとえば、10/31のクエリの最初の部分を実行すると、31日以降に発生した誕生日(つまり、31日で、11/11,11/2などではない月のみ)が選択されます。だから私の交差点は、その時間帯の間に誕生日があるにも関わらず、「0」になっています。また、この回答で書かれているようにクエリを読み込むと、Railsコンソールから「間違った数の引数(5に対して2)」が出ます。 – JHo

0

sqlにはさまざまな日付関数があります。そのうちのいくつかは、日/月(年とは無関係)を引き出します。私は確かに "年の日"(つまり1から365)を返すものがあると確信しています(もしあなたがそれを書くことができなければ) - その場合、あなたはそれを使用して、あなたが今手にしているものの中の小さな範囲内で、1日の練習をしましょう。あなたがEXTRACTを探しているよう

+2

あなたは 'extract(doy from bday) 'を使ってうるう年の問題に遭遇する可能性があります。おそらく、月と月を別々に考えるのが最も安全でしょう。 –

+0

素晴らしいです。私は抽出物を使用して終了し、毎月月曜日を考慮し、それは魅力的なように働いています! – Andrew

+0

@Andrew:あなたはそれが魅力のように働いていると確信していますか?あなたは月の数字が上月または下月に等しい時の日(私が私の元の試みでそのミスをしたことを認めます)だけを見るべきです。 –

関連する問題