【Ruby on Rails】whereで期間を範囲指定する方法

DBから期間で絞り込んでwhereで取り出す方法。

よく紹介されているのが以下のような書き方。

from = Date.today.beginning_of_month

to = Date.today.end_of_month

sample = Sample.where(created_at: from...to )

Sampleテーブルから、created_atの日付が今月のものを抜き出しているつもりです。

たとえば、12月であれば01日から31日まであるので、12月1日から12月31日までのデータを抜き出してくれそうな気がしますよね。

しかし、実際にこれにより発行されるSQL文は、

SELECT * FROM 'samples' WHERE 'samples'.'created_at' >= '2013-12-01' AND 'samples'.'created_at' < '2013-12-31'

となるのです。

つまり、このままでは12月31日のデータというのは含まないのです。

これはTimeでも同じ現象が起こります。

Railsのwhereで、DateやDatetimeを範囲指定した場合、from以上、to未満という絞り込み方をされるようです。

なので、上記の例であれば、

to = Date.today.next_month.beginning_of_month

としてやれば、次月の初日未満(初日は含まない)となるので、意図通りの絞り込みになります。