sql >> データベース >  >> RDS >> PostgreSQL

Now()がPostgreSQLでどのように機能するか

    PostgreSQLでは、now() 関数は、現在のトランザクションの開始時に、現在の日付と時刻(タイムゾーンオフセットを含む)を返します。

    これはtransaction_timestamp()と同等です 機能。

    current_timestampにも似ています 関数(引数なしで呼び出された場合)。

    now() 関数はパラメータを受け入れないため、精度を指定することはできませんが、current_timestamp 精度パラメータの有無にかかわらず呼び出すことができます。

    また、now() 非SQL標準です(transaction_timestamp()も同様です 関数)。

    構文

    構文は次のようになります:

    now()

    引数は必要ありません。

    基本的な例

    これがデモンストレーションの基本的な例です。

    SELECT now();

    結果:

    2020-07-02 09:51:12.088506+10

    トランザクション内

    これは、トランザクション内でどのように機能するかを示す例です。

    BEGIN;
    SELECT now();
    SELECT pg_sleep(5);
    SELECT now();
    SELECT pg_sleep(5);
    SELECT now();
    COMMIT;

    psqlを使用した場合の端末内の完全な出力は次のとおりです。

    postgres=# BEGIN;
    BEGIN
    postgres=# SELECT now();
                  now              
    -------------------------------
     2020-07-02 09:51:53.905091+10
    (1 row)
    
    
    postgres=# SELECT pg_sleep(5);
     pg_sleep 
    ----------
     
    (1 row)
    
    
    postgres=# SELECT now();
                  now              
    -------------------------------
     2020-07-02 09:51:53.905091+10
    (1 row)
    
    
    postgres=# SELECT pg_sleep(5);
     pg_sleep 
    ----------
     
    (1 row)
    
    
    postgres=# SELECT now();
                  now              
    -------------------------------
     2020-07-02 09:51:53.905091+10
    (1 row)
    
    
    postgres=# COMMIT;
    COMMIT

    pg_sleep()であっても、3つの時間値はすべて同じです。 関数は、now()への各呼び出し間の実行を遅らせるために使用されました 、それぞれがたまたま独自のSQLステートメントに含まれていました。

    したがって、各ステートメントに対して返される時間は、ステートメントではなく、現在のトランザクションの開始時間に基づいていることがわかります。トランザクションが進行しても変化しません。

    これにより、単一のトランザクションが「現在の」時刻の一貫した概念を持つことができるため、同じトランザクション内の複数の変更に同じタイムスタンプが付けられます。

    ステートメント内の複数の呼び出し

    また、ステートメントが進行しても変化しません。

    \x
    SELECT 
      now(),
      pg_sleep(5),
      now(),
      pg_sleep(5),
      now();

    結果(垂直出力を使用):

    now      | 2020-07-02 09:53:33.766806+10
    pg_sleep | 
    now      | 2020-07-02 09:53:33.766806+10
    pg_sleep | 
    now      | 2020-07-02 09:53:33.766806+10

    ここでも、pg_sleep()であっても、3つの時間値はすべて同じです。 関数は、now()への各呼び出し間の実行を遅らせるために使用されました 。

    これは、statement_timestamp()とは対照的です。 、実行 ステートメントごとに変更し、clock_timestamp() 関数。各ステートメントの進行中にも変化します(ステートメント内で複数回呼び出された場合)。


    1. テーブルの最初の行の削除を防ぐ方法(PostgreSQL)?

    2. データベースのハードウェアとインフラストラクチャの傾向

    3. EFコードファーストの計算列

    4. PostgreSQLの高可用性の管理–パートI:PostgreSQLの自動フェイルオーバー