PostgreSQLでは、transaction_timestamp()
関数は、現在のトランザクションの開始時に、現在の日付と時刻(タイムゾーンオフセットを含む)を返します。
これは、従来のPostgres関数now()
と同等です。 。
current_timestamp
にも似ています 関数(引数なしで呼び出された場合)。ただし、関数の機能を明確に反映するように名前が付けられています。
transaction_timestamp()
関数はパラメータを受け入れないため、精度を指定することはできませんが、current_timestamp
精度パラメータの有無にかかわらず呼び出すことができます。
また、transaction_timestamp()
非SQL標準関数です。
構文
構文は次のようになります:
transaction_timestamp()
引数は必要ありません。
基本的な例
これがデモンストレーションの基本的な例です。
SELECT transaction_timestamp();
結果:
2020-07-02 08:23:08.810484+10
トランザクション内
これは、トランザクション内でどのように機能するかを示す例です。
BEGIN;
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
COMMIT;
psqlを使用した場合の端末内の完全な出力は次のとおりです。
postgres=# BEGIN; BEGIN postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+10 (1 row) postgres=# COMMIT; COMMIT
pg_sleep()
であっても、3つの時間値はすべて同じです。 関数は、transaction_timestamp()
への各呼び出し間の実行を遅らせるために使用されました 、それぞれがたまたま独自のSQLステートメントに含まれていました。
したがって、各ステートメントに対して返される時間は、ステートメントではなく、現在のトランザクションの開始時間に基づいていることがわかります。トランザクションが進行しても変化しません。
これにより、単一のトランザクションが「現在の」時刻の一貫した概念を持つことができるため、同じトランザクション内の複数の変更に同じタイムスタンプが付けられます。
ステートメント内の複数の呼び出し
また、ステートメントが進行しても変化しません。
\x
SELECT
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp();
結果(垂直出力を使用):
transaction_timestamp | 2020-07-02 09:15:56.154175+10 pg_sleep | transaction_timestamp | 2020-07-02 09:15:56.154175+10 pg_sleep | transaction_timestamp | 2020-07-02 09:15:56.154175+10
ここでも、pg_sleep()
であっても、3つの時間値はすべて同じです。 関数は、transaction_timestamp()
への各呼び出し間の実行を遅らせるために使用されました 。
これは、statement_timestamp()
とは対照的です。 、実行 ステートメントごとに変更し、clock_timestamp()
関数。各ステートメントの進行中にも変化します(ステートメント内で複数回呼び出された場合)。