m6uのエンジニアっぽい日記

PHP利用開発やFuelPHP利用開発、PostgreSQL利用開発、Androidアプリ開発、CentOS7サーバー構築など、テクニカルでエンジニアっぽい内容の日記

PostgreSQL:様々な現在日時

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)

f:id:m6u:20200131165325p:plain
実行例(A5:SQL mk-IIにて)