はサウンド:
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)配列を使用すると、月/日のペアを別々にではなく単一の単位として互いに比較することができます。
素晴らしい。私はいくつかのレコードでテストしていましたが、以前のクエリはうまくいくように見えましたが、今どこで誤った結果が出るかわかります。どうもありがとうございます!私はSQLの専門家ではないので、私はいつもこのようなことについて助けが必要です。 – Andrew
@Andrew:もともと私はおそらくあなたと同じ間違いを犯しました。私はこのことをうまくやっています:)限られたデータセットに基づいてクエリを推論することは危険に満ちているので、お互いの仕事をチェックするのです。 –
これは数か月(たとえば10/31-11/4)にわたって機能しますか?たとえば、10/31のクエリの最初の部分を実行すると、31日以降に発生した誕生日(つまり、31日で、11/11,11/2などではない月のみ)が選択されます。だから私の交差点は、その時間帯の間に誕生日があるにも関わらず、「0」になっています。また、この回答で書かれているようにクエリを読み込むと、Railsコンソールから「間違った数の引数(5に対して2)」が出ます。 – JHo