PostgreSQLが備える、標準SQL互換の日時取得
PostgreSQLは、現在の日付時刻に関した値を返す多くの関数を提供します。 これらの標準SQL関数はすべて、現在のトランザクションの開始時刻に基づいた値を返します。
- CURRENT_DATE → 今日の日付
- CURRENT_TIME → 今の時刻
- CURRENT_TIMESTAMP → 今の日時
- CURRENT_TIME(precision) → 今の時刻を精度precision指定で
- CURRENT_TIMESTAMP(precision) → 今の日時を精度precision指定で
- LOCALTIME → 現地の時刻
- LOCALTIMESTAMP → 現地の日時(ローカルなのでタイムゾーン情報なし)
- LOCALTIME(precision) → 現地の時刻を精度precision指定で
- LOCALTIMESTAMP(precision) → 現地の日時を精度precision指定で(ローカルなのでタイムゾーン情報なし)
precision に 0 を与えると、秒未満の成分を丸めてきれいな秒(?)が得られる。 3 を与えれば3桁に丸められる。
標準SQL非互換の、PostgreSQL固有の現在日時取得
- transaction_timestamp() → CURRENT_TIMESTAMPと等価で、トランザクション開始時刻
- statement_timestamp() → SQL文実行時点の時刻
- clock_timestamp() → 実際の現在時刻
- timeofday() → clock_timestamp()同様、実際の現在時刻を返しますが、timestamp with time zone型の値ではなく、整形されたtext文字列(例えば Fri Jan 31 16:48:50.349848 2020 JST)を返します
- now() → transaction_timestamp()と同じもので、トランザクション開始時刻
トランザクション下で例えばupdate文やinsert into文で「now()」を使うと、トランザクション開始時刻できれいに日時が揃ってしまうけど、「clock_timestamp()」を使えば処理が行われた実時刻が使われるということ。
select clock_timestamp(), statement_timestamp(), timeofday(), now(), current_timestamp(0)