I PostgreSQL er now()
funktion returnerer den aktuelle dato og det aktuelle klokkeslæt (inklusive tidszoneforskydningen) ved starten af den aktuelle transaktion.
Det svarer til transaction_timestamp()
funktion.
Det ligner også current_timestamp
funktion (når den kaldes uden et argument).
now()
Funktionen accepterer ikke nogen parametre, så du kan ikke angive dens præcision, hvorimod current_timestamp
kan kaldes med eller uden en præcisionsparameter.
Også now()
er ikke-SQL-standard (som er transaction_timestamp()
funktion).
Syntaks
Syntaksen ser sådan ud:
now()
Ingen argumenter er påkrævet eller accepteret.
Grundlæggende eksempel
Her er et grundlæggende eksempel at demonstrere.
SELECT now();
Resultat:
2020-07-02 09:51:12.088506+10
Inden for en transaktion
Her er et eksempel, der viser, hvordan det fungerer inden for en transaktion.
BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;
Her er det fulde output i min terminal, når jeg bruger 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 tre tidsværdier er identiske, selvom pg_sleep()
funktion blev brugt til at forsinke eksekveringen mellem hvert kald til now()
, som hver tilfældigvis var i sin egen SQL-sætning.
Så vi kan se, at den returnerede tid for hver erklæring er baseret på starttidspunktet for den aktuelle transaktion – ikke erklæringen. Det ændrer sig ikke, efterhånden som transaktionen skrider frem.
Dette gør det muligt for en enkelt transaktion at have en konsistent forestilling om det "aktuelle" tidspunkt, så flere ændringer inden for samme transaktion bærer det samme tidsstempel.
Flere opkald inden for et kontoudtog
Det ændrer sig heller ikke, efterhånden som udsagnet skrider frem.
\x
SELECT
now(),
pg_sleep(5),
now(),
pg_sleep(5),
now();
Resultat (ved hjælp af lodret output):
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
Igen er alle tre tidsværdier identiske, selvom pg_sleep()
funktion blev brugt til at forsinke eksekveringen mellem hvert kald til now()
.
Dette er i modsætning til statement_timestamp()
, hvilket gør ændres med hver sætning, og også clock_timestamp()
funktion, som ændres, selv når den skrider frem gennem hver sætning (hvis den kaldes flere gange i sætningen).