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()
:?now()
ist definiert,STABLE
weil der Wert (die Startzeit der aktuellen Transaktion) innerhalb derselben Transaktion gleich ist. Ich Ihr Beispielnow()
wird nur einmal ausgeführt (im Gegensatz zuclock_timestamp()
zum Beispiel).Da sie bei ordnungsgemäßer Verwendung keinen funktionalen Unterschied aufweisen, werden sie unterschiedlich besetzt:
'now()'
anerkannt (genau wie'today'
oder'now'
):'CURRENT_TIMESTAMP'
gibt lustige fehler von dunklen kantenund
'transaction_timestamp()'
wird einfach nicht als Zeitstempel mit tz-Wert erkannt:Bitte frag nicht, warum du gießen würdest
'now()' as timestamp
. Ich habe gesehen,where timestamp_column = 'now()'
anstattwhere timestamp_column = now()
in People-Code, so dachte, diese Klarstellung wäre lustig Tatsache und eine gute Ergänzung zu Erwins Antwort.quelle
'now()'
ähnelt der Funktionnow()
auf der Oberfläche, ist jedoch ansonsten nicht direkt verknüpft.'now'
ist eine Konstante, die zur Startzeit der aktuellen Transaktion ausgewertet wird . Trailing Parens werden ignoriert. Der Versuch , die Saiten zu werfen'CURRENT_TIMESTAMP'
oder'transaction_timestamp()'
zutimestamp
in ähnlicher Weise versagt, denn das ist nur Unsinn. Beides hat nichts mit den entsprechenden Funktionen zu tun.