Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails+PostgreSQL: EXTRACT関数で期間をスマートに扱う(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails+PostgreSQL: EXTRACT関数で日付をスマートに扱う方法(翻訳)

eコマースプラットフォームを実装中に、今年の注文をすべて取り出したくなったとしましょう。Railsでこれをやれる最もシンプルな方法はどんなものがあるでしょうか。おそらく次のようなクエリを書くのではないでしょうか。

Order.where("created_at >= ? AND created_at < ?", 
Date.today.beginning_of_year, 
Date.today.beginning_of_year.next_year)

これでもやれますが、どうにも不自然な方法で範囲フィルタする必要があります。何らかのネイティブ関数を用いて、一般的なユースケースに耐えうる方法で扱うべきでしょう。しかしそんなことが可能なのでしょうか?

実はあるのです。EXTRACT関数とnow()関数を使います。前者はタイムスタンプから現在のを抽出でき、後者は現在時刻を取り出せます。

2つの関数を組み合わせれば、次のようなクエリを書けます。

Order.where("EXTRACT(year FROM created_at) = EXTRACT(year FROM now())")

断然スッキリしました!この方法のようにEXTRACT(year FROM created_at)の関数的インデックスを作成すれは、シーケンシャルスキャンを回避してパフォーマンスを著しく高めることもできます。

関連記事

Rails: データベーススキーマをダウンタイムなしで変更する(翻訳)

データベースのランダム読み出しは要注意(翻訳)

Rails: データベースのパフォーマンスを損なう3つの書き方(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。