2023年4月14日金曜日

PostgreSQL で日付型絞り込み検索

PostgreSQL において、テーブル t に含まれる登録日時を記録した日付型のカラム entryTime が存在しているとする。

そのテーブルに対して先々月、先月、当月に該当するレコードをそれぞれ取り出す。なんてのは業務処理のレポート出力でありがちなパターンと言える。

それぞれのクエリを書いてみよう。

先々月
SELECT *
  FROM t
 WHERE date_trunc('month', current_date) - interval '2 month' <= t.entryTime
   AND t.entryTime < date_trunc('month', current_date) - interval '1 month';

先月
SELECT *
  FROM t
 WHERE date_trunc('month', current_date) - interval '1 month' <= t.entryTime
   AND t.entryTime < date_trunc('month', current_date);

当月
SELECT *
  FROM t
 WHERE date_trunc('month', current_date) <= t.entryTime
   AND t.entryTime < date_trunc('month', current_date) + interval '1 month';

interval の指定は '-1 month' 等の書式も有効であるため、上記のクエリをシステムに組み込む際には パラメータ置き換えを使って全て同じ式でまとめて表現することも可能である。

この手の実装でよくあるミスとしては、月初から月末の 00:00:00 までの日付範囲で判定して月末の時刻を持つデータが拾えていないパターンである。 上記のクエリで示したように対象月の月初から翌月の月初未満の範囲で判定するのが漏れの発生しない手堅く確実な方法だと言える。

0 件のコメント:

コメントを投稿