web-dev-qa-db-ja.com

now()とcurrent_timestampの違い

PostgreSQLでは、now()およびcurrent_timestamp関数を使用していますが、違いはありません。

# SELECT now(), current_timestamp;
              now               |              now               
--------------------------------+--------------------------------
 04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)

何か不足していますか?

51
JohnMerlino

違いはありません。 マニュアルからの3つの引用:

1)

これらのSQL標準関数はすべて、現在のトランザクションの開始時間に基づいて値を返します。
...
_CURRENT_TIMESTAMP_
...

2)

transaction_timestamp()は_CURRENT_TIMESTAMP_と同等ですが、返されるものを明確に反映するように名前が付けられています。

3)

now()は、transaction_timestamp()と同等の従来のPostgreSQLです。

太字は私のものを強調しています。 _CURRENT_TIMESTAMP_、transaction_timestamp()およびnow()まったく同じを実行します。 _CURRENT_TIMESTAMP_は、関数の構文上の奇数であり、括弧の末尾のペアはありません。これは、SQL標準に準拠しています。

SQLステートメントで関数呼び出しの列エイリアスを宣言しない場合、エイリアスはデフォルトで関数の名前になります。内部的には、標準SQLの_CURRENT_TIMESTAMP_はnow()で実装されています。結果の列名に表示されるPostgres 9.6までは「現在」でしたが、Postgres 10では「current_timestamp」に変更されました。

transaction_timestamp()も同じですが、これは適切なPostgres関数であるため、デフォルトのエイリアスは常に「transaction_timestamp」でした。

notを実行して、これらの関数を特別な 入力定数_'now'_ 。これは、特定の日付/時刻/タイムスタンプの値を表すいくつかの表記法の1つにすぎません マニュアルの引用:

...読み取り時に通常の日付/時刻値に変換されます。 (特に、nowおよび関連する文字列は、読み取られるとすぐに特定の時刻値に変換されます。)これらの値はすべて、SQLコマンドで定数として使用する場合、単一引用符で囲む必要があります。

(少なくともPostgres 12まで)先頭と末尾のスペースとブラケット({[( )]})がこれらの特別な入力値から削除されるという混乱を招く可能性があります。したがって、'now()'::timestamptz-または明示的な型キャストが不要な'now()'も有効であり、たまたま関数now()と同じタイムスタンプに評価されますほとんどのコンテキストで。しかし、これらは定数であり、通常はでないたとえば、列のデフォルトとして必要なものです。

db <> fiddle ここ
古い SQLフィドル

注目すべき選択肢はstatement_timestamp()clock_timestamp()マニュアル:

statement_timestamp()は、現在のステートメントの開始時刻(より具体的には、クライアントからの最新のコマンドメッセージの受信時刻)を返します。 [...]
clock_timestamp()は実際の現在時刻を返すため、単一のSQLコマンド内でもその値は変化します。

注:statement_timestamp()は、上記のSTABLEです(常に同じSQLコマンド内で同じ値を返します)。ただし、clock_timestamp()は、必ずしもVOLATILEのみです。違いが大きい場合があります。

63

さらに、適切に使用しても機能上の違いはなく、キャスト方法も異なります。

'now()' recongnized(ちょうど_'today'_または_'now'_のように):

_b=# select 'now()'::timestamptz;
          timestamptz
-------------------------------
 2016-12-09 16:31:35.942243+00
(1 row)
_

_'CURRENT_TIMESTAMP'_は 暗いエッジからの面白いエラー を与えます

注:PostgreSQLバージョン7.2以降、 'current'は日付/時刻定数としてサポートされなくなりました

_b=# select 'CURRENT_TIMESTAMP'::timestamptz;
ERROR:  date/time value "current" is no longer supported
LINE 1: select 'CURRENT_TIMESTAMP'::timestamptz;
               ^
_

'transaction_timestamp()'は、tz値のタイムスタンプとして認識されません。

_b=# select 'transaction_timestamp()'::timestamptz;
ERROR:  invalid input syntax for type timestamp with time zone: "transaction_timestamp()"
LINE 1: select 'transaction_timestamp()'::timestamptz;
               ^
_

'now()' as timestampをキャストする理由を尋ねないでください。私は人々のコードでwhere timestamp_column = 'now()'ではなくwhere timestamp_column = now()を見たので、この説明はおかしな事実であり、Erwinの答えに追加されると思いました。

3
Vao Tsun