概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: PostgreSQL Quick Tips: Working With Dates Using EXTRACT function - Karol Galanciak - Ruby on Rails and Ember.js consultant
- 原文公開日: 2018/01/30
- 著者: Karol Galanciak
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)
の関数的インデックスを作成すれは、シーケンシャルスキャンを回避してパフォーマンスを著しく高めることもできます。