PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie Now() in PostgreSQL funktioniert

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).