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_TIMESTAMP
ist 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_TIMESTAMP
mit 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 now
und 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 STABLE
wie 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()
:?