PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona Now() in PostgreSQL

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