I PostgreSQL, now()
funktionen returnerar aktuellt datum och tid (inklusive tidszonsförskjutningen), i början av den aktuella transaktionen.
Det är motsvarigheten till transaction_timestamp()
funktion.
Det liknar också current_timestamp
funktion (när anropad utan argument).
now()
Funktionen accepterar inte några parametrar, så du kan inte specificera dess precision, medan current_timestamp
kan anropas med eller utan en precisionsparameter.
Även now()
är icke-SQL-standard (liksom transaction_timestamp()
funktion).
Syntax
Syntaxen ser ut så här:
now()
Inga argument krävs eller accepteras.
Grundläggande exempel
Här är ett grundläggande exempel att visa.
SELECT now();
Resultat:
2020-07-02 09:51:12.088506+10
Inom en transaktion
Här är ett exempel för att visa hur det fungerar inom en transaktion.
BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;
Här är hela resultatet i min terminal när jag använder 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
Alla tre tidsvärdena är identiska, även om pg_sleep()
funktion användes för att fördröja exekvering mellan varje anrop till now()
, som var och en råkade vara i sin egen SQL-sats.
Så vi kan se att tiden som returneras för varje uttalande baseras på starttiden för den aktuella transaktionen – inte uttalandet. Det ändras inte när transaktionen fortskrider.
Detta tillåter en enskild transaktion att ha en konsekvent uppfattning om den "aktuella" tiden, så att flera ändringar inom samma transaktion har samma tidsstämpel.
Flera samtal inom ett kontoutdrag
Det ändras inte heller när uttalandet fortskrider.
\x
SELECT
now(),
pg_sleep(5),
now(),
pg_sleep(5),
now();
Resultat (med vertikal utdata):
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
Återigen, alla tre tidsvärdena är identiska, även om pg_sleep()
funktion användes för att fördröja exekvering mellan varje anrop till now()
.
Detta är i motsats till statement_timestamp()
, vilket gör ändras med varje sats, och även clock_timestamp()
funktion, som ändras även när den fortskrider genom varje sats (om den anropas flera gånger i satsen).