In PostgreSQL is de now()
functie retourneert de huidige datum en tijd (inclusief de tijdzone-offset), aan het begin van de huidige transactie.
Het is het equivalent van de transaction_timestamp()
functie.
Het is ook vergelijkbaar met de current_timestamp
functie (indien aangeroepen zonder argument).
De now()
functie accepteert geen parameters, dus u kunt de precisie ervan niet specificeren, terwijl current_timestamp
kan worden aangeroepen met of zonder een precisieparameter.
Ook now()
is niet-SQL-standaard (zoals de transaction_timestamp()
functie).
Syntaxis
De syntaxis gaat als volgt:
now()
Er zijn geen argumenten vereist of geaccepteerd.
Basisvoorbeeld
Hier is een eenvoudig voorbeeld om te demonstreren.
SELECT now();
Resultaat:
2020-07-02 09:51:12.088506+10
Binnen een transactie
Hier is een voorbeeld om te laten zien hoe het werkt binnen een transactie.
BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;
Hier is de volledige uitvoer in mijn terminal bij gebruik van 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 drie de tijdwaarden zijn identiek, hoewel de pg_sleep()
functie werd gebruikt om de uitvoering te vertragen tussen elke aanroep naar now()
, die elk toevallig in hun eigen SQL-instructie stonden.
We kunnen dus zien dat de tijd die voor elk afschrift wordt geretourneerd, is gebaseerd op de starttijd van de huidige transactie - niet op het afschrift. Het verandert niet naarmate de transactie vordert.
Hierdoor kan een enkele transactie een consistent idee hebben van de "huidige" tijd, zodat meerdere wijzigingen binnen dezelfde transactie hetzelfde tijdstempel dragen.
Meerdere oproepen binnen een verklaring
Het verandert ook niet naarmate de verklaring vordert.
\x
SELECT
now(),
pg_sleep(5),
now(),
pg_sleep(5),
now();
Resultaat (met verticale uitvoer):
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
Nogmaals, alle drie de tijdwaarden zijn identiek, hoewel de pg_sleep()
functie werd gebruikt om de uitvoering te vertragen tussen elke aanroep naar now()
.
Dit in tegenstelling tot statement_timestamp()
, wat doet veranderen met elke instructie, en ook de clock_timestamp()
functie, die verandert zelfs als het door elke instructie gaat (indien meerdere keren aangeroepen binnen de instructie).