茶漬けの技術メモ

Golang, Rubyで趣味開発します。テックニュース書いたり。ガジェット触ったり。

Rubyで日付・時刻の範囲検索

指定の時間範囲内の記録を読み出したい場合
(例えば今日中で登録したユーザーを探したい)

よくある書き方

User.where(“updated_at BETWEEN ? AND ?”, beginning_of_day, end_of_day)

Rubyならではの書き方

Rubyでは、もっと簡単にRangeオブジェクトをwhereの値指定として渡す書き方があります。

一日の時刻範囲を指定する
> today = Time.zone.now
Mon, 04 Sep 2017 09:54:26 JST +09:00
> today_range = today.beginning_of_day..today.end_of_day 
Mon, 04 Sep 2017 00:00:00 JST +09:00..Mon, 04 Sep 2017 23:59:59 JST +09:00

あるいは

> today_range = Time.zone.now.all_day 
Mon, 04 Sep 2017 00:00:00 JST +09:00..Mon, 04 Sep 2017 23:59:59 JST +09:00


一日の時刻範囲をwhereに渡す
> User.where(created_at: today_range)
  User Load (1.6ms)  SELECT `users`.* FROM `users` WHERE (`users`.`created_at` BETWEEN '2017-09-04 00:00:00' AND '2017-09-04 23:59:59')

こうすれば一日中登録したユーザーを簡単に読み出せる

他には

beginning_of_month
beginning_of_quarter 

など、時間の範囲を指定したい場合使えます。
参考URL:
http://railsdoc.com/references/beginning_of_month


こちらもどうぞ

o-tyazuke.hatenablog.com