In PostgreSQL der now()
Die Funktion gibt das aktuelle Datum und die Uhrzeit (einschließlich des Zeitzonen-Offsets) zu Beginn der aktuellen Transaktion zurück.
Es ist das Äquivalent zu transaction_timestamp()
Funktion.
Es ähnelt auch dem current_timestamp
Funktion (wenn ohne Argument aufgerufen).
Der now()
Die Funktion akzeptiert keine Parameter, sodass Sie ihre Genauigkeit nicht angeben können, während current_timestamp
kann mit oder ohne Genauigkeitsparameter aufgerufen werden.
Außerdem now()
ist kein SQL-Standard (ebenso wie transaction_timestamp()
Funktion).
Syntax
Die Syntax lautet wie folgt:
now()
Es sind keine Argumente erforderlich oder akzeptiert.
Einfaches Beispiel
Hier ist ein einfaches Beispiel zur Veranschaulichung.
SELECT now();
Ergebnis:
2020-07-02 09:51:12.088506+10
Innerhalb einer Transaktion
Hier ist ein Beispiel, um zu demonstrieren, wie es innerhalb einer Transaktion funktioniert.
BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;
Hier ist die vollständige Ausgabe in meinem Terminal bei Verwendung von psql:
postgres=# BEGIN; BEGIN postgres=# SELECT now(); now ------------------------------- 2020-07-02 09:51:53.905091+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT now(); now ------------------------------- 2020-07-02 09:51:53.905091+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT now(); now ------------------------------- 2020-07-02 09:51:53.905091+10 (1 row) postgres=# COMMIT; COMMIT
Alle drei Zeitwerte sind identisch, obwohl pg_sleep()
Funktion wurde verwendet, um die Ausführung zwischen jedem Aufruf von now()
zu verzögern , die jeweils in einer eigenen SQL-Anweisung enthalten waren.
Wir können also sehen, dass die für jede Anweisung zurückgegebene Zeit auf der Startzeit der aktuellen Transaktion basiert – nicht auf der Anweisung. Es ändert sich nicht, während die Transaktion fortschreitet.
Dadurch kann eine einzelne Transaktion eine konsistente Vorstellung von der „aktuellen“ Zeit haben, sodass mehrere Änderungen innerhalb derselben Transaktion denselben Zeitstempel tragen.
Mehrere Aufrufe innerhalb einer Anweisung
Es ändert sich auch nicht, wenn die Anweisung fortschreitet.
\x
SELECT
now(),
pg_sleep(5),
now(),
pg_sleep(5),
now();
Ergebnis (bei vertikaler Ausgabe):
now | 2020-07-02 09:53:33.766806+10 pg_sleep | now | 2020-07-02 09:53:33.766806+10 pg_sleep | now | 2020-07-02 09:53:33.766806+10
Auch hier sind alle drei Zeitwerte identisch, obwohl pg_sleep()
Funktion wurde verwendet, um die Ausführung zwischen jedem Aufruf von now()
zu verzögern .
Dies steht im Gegensatz zu statement_timestamp()
, was macht ändern sich mit jeder Anweisung, und auch der clock_timestamp()
-Funktion, die sich auch im Verlauf jeder Anweisung ändert (wenn sie innerhalb der Anweisung mehrmals aufgerufen wird).