In PostgreSQL, il transaction_timestamp()
La funzione restituisce la data e l'ora correnti (incluso l'offset del fuso orario), all'inizio della transazione corrente.
È l'equivalente della tradizionale funzione Postgres now()
.
È anche simile a current_timestamp
funzione (quando chiamato senza un argomento), tranne per il fatto che ha un nome per riflettere chiaramente ciò che fa.
Il transaction_timestamp()
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, transaction_timestamp()
è una funzione non standard SQL.
Sintassi
La sintassi è questa:
transaction_timestamp()
Nessun argomento è richiesto o accettato.
Esempio di base
Ecco un esempio di base da dimostrare.
SELECT transaction_timestamp();
Risultato:
2020-07-02 08:23:08.810484+10
All'interno di una transazione
Ecco un esempio per dimostrare come funziona all'interno di una transazione.
BEGIN;
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
COMMIT;
Ecco l'output completo all'interno del mio terminale quando si utilizza psql:
postgres=# BEGIN; BEGIN postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+10 (1 row) postgres=# SELECT pg_sleep(5); pg_sleep ---------- (1 row) postgres=# SELECT transaction_timestamp(); transaction_timestamp ------------------------------- 2020-07-02 08:27:04.229266+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 transaction_timestamp()
, 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
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp();
Risultato (usando l'output verticale):
transaction_timestamp | 2020-07-02 09:15:56.154175+10 pg_sleep | transaction_timestamp | 2020-07-02 09:15:56.154175+10 pg_sleep | transaction_timestamp | 2020-07-02 09:15:56.154175+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 transaction_timestamp()
.
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).