In PostgreSQL, il now()
La funzione restituisce la data e l'ora correnti (incluso l'offset del fuso orario), all'inizio della transazione corrente.
È l'equivalente di transaction_timestamp()
funzione.
È anche simile a current_timestamp
funzione (se chiamata senza argomento).
Il now()
la funzione non accetta alcun parametro, quindi non puoi specificarne la precisione, mentre current_timestamp
può essere chiamato con o senza un parametro di precisione.
Inoltre, now()
non è uno standard SQL (come lo è transaction_timestamp()
funzione).
Sintassi
La sintassi è questa:
now()
Nessun argomento è richiesto o accettato.
Esempio di base
Ecco un esempio di base da dimostrare.
SELECT now();
Risultato:
2020-07-02 09:51:12.088506+10
All'interno di una transazione
Ecco un esempio per dimostrare come funziona all'interno di una transazione.
BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;
Ecco l'output completo all'interno del mio terminale quando si utilizza 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
Tutti e tre i valori temporali sono identici, anche se pg_sleep()
è stata utilizzata per ritardare l'esecuzione tra ogni chiamata a now()
, ognuno dei quali si trovava nella propria istruzione SQL.
Quindi possiamo vedere che il tempo restituito per ogni istruzione si basa sull'ora di inizio della transazione corrente, non sull'istruzione. Non cambia con l'avanzamento della transazione.
Ciò consente a una singola transazione di avere una nozione coerente dell'ora "corrente", in modo che più modifiche all'interno della stessa transazione abbiano lo stesso timestamp.
Più chiamate all'interno di un estratto conto
Inoltre, non cambia man mano che l'istruzione avanza.
\x
SELECT
now(),
pg_sleep(5),
now(),
pg_sleep(5),
now();
Risultato (usando l'output verticale):
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
Anche in questo caso, tutti e tre i valori temporali sono identici, anche se pg_sleep()
è stata utilizzata per ritardare l'esecuzione tra ogni chiamata a now()
.
Questo è in contrasto con statement_timestamp()
, che fa cambia con ogni istruzione e anche clock_timestamp()
funzione, che cambia anche mentre avanza attraverso ogni istruzione (se chiamata più volte all'interno dell'istruzione).