it-swarm.com.de

Unterschied zwischen now () und current_timestamp

In PostgreSQL verwende ich die now() und current_timestamp Funktion und ich sehe keinen Unterschied:

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

Vermisse ich etwas

51
JohnMerlino

Es gibt keinen Unterschied. Drei Zitate aus dem Handbuch :

1)

Diese SQL-Standardfunktionen geben alle Werte basierend auf der Startzeit der aktuellen Transaktion zurück:
...
CURRENT_TIMESTAMP
...

2)

transaction_timestamp() entspricht CURRENT_TIMESTAMP, wird jedoch benannt, um die Rückgabe klar wiederzugeben.

3)

now() ist ein traditionelles PostgreSQL-Äquivalent zu transaction_timestamp().

Mutige Betonung meiner. CURRENT_TIMESTAMP, transaction_timestamp() und now() do genau dasselbe. CURRENT_TIMESTAMP Ist eine syntaktische Kuriosität für eine Funktion ohne nachfolgendes Klammerpaar. Das entspricht dem SQL-Standard.

Wenn Sie in einer SQL-Anweisung keinen Spaltenalias für einen Funktionsaufruf deklarieren, wird standardmäßig der Name der Funktion verwendet. Intern wird das Standard-SQL CURRENT_TIMESTAMP Mit now() implementiert. Bis zu Postgres 9.6, das in der resultierenden Spalte den Namen anzeigt, der "jetzt" war, aber in Postgres 10 in "current_timestamp" geändert wurde.

transaction_timestamp() macht dasselbe, aber dies ist eine richtige Postgres-Funktion, daher war der Standardalias immer "transaction_timestamp".

Verwechseln Sie nicht eine dieser Funktionen mit dem speziellen Eingabekonstante 'now' . Dies ist nur eine von mehreren Kurzbezeichnungen für bestimmte Datums-/Zeit-/Zeitstempelwerte, nter Angabe des Handbuchs :

... die beim Lesen in normale Datums-/Zeitwerte umgewandelt werden. (Insbesondere werden now und zugehörige Zeichenfolgen beim Lesen in einen bestimmten Zeitwert konvertiert.) Alle diese Werte müssen in einfache Anführungszeichen gesetzt werden, wenn sie als Konstanten in SQL-Befehlen verwendet werden.

Dies kann zu der Verwirrung führen, dass (bis mindestens Postgres 12) eine beliebige Anzahl von führenden und nachfolgenden Leerzeichen und Klammern ({[( )]}) von diesen speziellen Eingabewerten abgeschnitten werden. 'now()'::timestamptz - oder nur 'now()', für die keine explizite Typumwandlung erforderlich ist - ist ebenfalls gültig und wird zufällig mit demselben Zeitstempel wie die Funktion now()ausgewertet. -in den meisten Kontexten. Aber das sind Konstanten und normalerweise nicht was Sie zum Beispiel als Spaltenstandard wollen.

db <> fiddle hier
Alt SQL-Geige

Bemerkenswerte Alternativen sind statement_timestamp() und clock_timestamp(). Das Handbuch :

statement_timestamp() gibt die Startzeit der aktuellen Anweisung zurück (genauer gesagt den Zeitpunkt des Empfangs der letzten Befehlsnachricht vom Client). [...]
clock_timestamp() gibt die aktuelle Uhrzeit zurück, und daher ändert sich ihr Wert auch innerhalb eines einzelnen SQL-Befehls.

Hinweis: statement_timestamp() ist STABLE wie oben (gibt immer denselben Wert innerhalb desselben SQL-Befehls zurück). Aber clock_timestamp() ist notwendigerweise nur VOLATILE. Der Unterschied kann erheblich sein.

63

Da sie bei ordnungsgemäßer Verwendung keinen funktionalen Unterschied aufweisen, werden sie unterschiedlich gegossen:

'now()' recongnized (genau wie 'today' oder 'now'):

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

'CURRENT_TIMESTAMP' Gibt lustiger Fehler von dunklen Rändern

Hinweis: Ab PostgreSQL Version 7.2 wird 'current' nicht mehr als Datums-/Zeitkonstante unterstützt

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

und 'transaction_timestamp()' wird einfach nicht als Zeitstempel mit tz-Wert erkannt:

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

Bitte fragen Sie nicht, warum Sie 'now()' as timestamp umsetzen würden. Ich habe where timestamp_column = 'now()' anstelle von where timestamp_column = now() im Personencode gesehen, daher dachte ich, diese Klarstellung wäre eine lustige Tatsache und eine gute Ergänzung zu Erwins Antwort.

3
Vao Tsun