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()ist äquivalent zu CURRENT_TIMESTAMP, wird aber benannt, um deutlich zu machen, was es zurückgibt.
3)
now()ist ein traditionelles PostgreSQL-Äquivalent zu transaction_timestamp().
Meine kühne Betonung. CURRENT_TIMESTAMP, transaction_timestamp()Und now()tun genau das gleiche. CURRENT_TIMESTAMPist eine syntaktische Kuriosität für eine Funktion ohne nachfolgende Klammern. 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_TIMESTAMPmit implementiert now(). Bis zu Postgres 9.6, der im resultierenden Spaltennamen angezeigt wird , der "jetzt" lautete, aber in Postgres 10 in "current_timestamp" geändert wurde.
transaction_timestamp() tut dasselbe, aber dies ist eine richtige Postgres-Funktion, daher war der Standardalias immer "transaction_timestamp".
Verwechseln Sie keine dieser Funktionen mit der speziellen Eingangskonstante'now' . Dies ist nur eine von mehreren Abkürzungen für bestimmte Datums- / Zeit- / Zeitstempelwerte, die im Handbuch zitiert werden:
... die beim Lesen in normale Datums- / Zeitwerte umgewandelt werden. (Insbesondere nowund verwandte Zeichenfolgen werden in einen bestimmten Zeitwert konvertiert, sobald sie gelesen werden.) Alle diese Werte müssen in einfache Anführungszeichen eingeschlossen werden, wenn sie in SQL-Befehlen als Konstanten verwendet werden.
Es 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. Also 'now()'::timestamptz- oder nur 'now()'wenn keine explizite Typumwandlung erforderlich ist - ist auch gültig und wird now() in den meisten Kontexten mit demselben Zeitstempel wie die Funktion ausgewertet . Aber das sind Konstanten und normalerweise nicht das, was Sie zum Beispiel als Spaltenvorgabe wollen.
db <> fiddle here
Alte 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 STABLEwie oben (gibt immer den gleichen Wert innerhalb des gleichen SQL-Befehls zurück). Muss aber clock_timestamp()unbedingt nur sein VOLATILE. Der Unterschied kann erheblich sein.
where items.createddate > now():?