No PostgreSQL, o
transaction_timestamp()
A função retorna a data e hora atuais (incluindo o deslocamento de fuso horário), no início da transação atual. É o equivalente da função tradicional do Postgres
now()
. Também é semelhante ao
current_timestamp
função (quando chamada sem um argumento), exceto que ela é nomeada para refletir claramente o que ela faz. O
transaction_timestamp()
função não aceita nenhum parâmetro, então você não pode especificar sua precisão, enquanto current_timestamp
pode ser chamado com ou sem um parâmetro de precisão. Além disso,
transaction_timestamp()
é uma função não padrão SQL. Sintaxe
A sintaxe fica assim:
transaction_timestamp()
Nenhum argumento é necessário ou aceito.
Exemplo básico
Aqui está um exemplo básico para demonstrar.
SELECT transaction_timestamp();
Resultado:
2020-07-02 08:23:08.810484+10
Dentro de uma transação
Aqui está um exemplo para demonstrar como funciona dentro de uma transação.
BEGIN;
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
SELECT pg_sleep(5);
SELECT transaction_timestamp();
COMMIT;
Aqui está a saída completa dentro do meu terminal ao usar o 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
Todos os três valores de tempo são idênticos, embora o
pg_sleep()
função foi usada para atrasar a execução entre cada chamada para transaction_timestamp()
, cada um dos quais estava em sua própria instrução SQL. Assim, podemos ver que a hora retornada para cada instrução é baseada na hora de início da transação atual – não na instrução. Não muda à medida que a transação avança.
Isso permite que uma única transação tenha uma noção consistente da hora “atual”, de modo que várias modificações na mesma transação tenham o mesmo carimbo de hora.
Várias chamadas em um extrato
Também não muda à medida que a declaração progride.
\x
SELECT
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp(),
pg_sleep(5),
transaction_timestamp();
Resultado (usando saída vertical):
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
Novamente, todos os três valores de tempo são idênticos, embora o
pg_sleep()
função foi usada para atrasar a execução entre cada chamada para transaction_timestamp()
. Isso contrasta com
statement_timestamp()
, que faz muda com cada instrução, e também o clock_timestamp()
função, que muda mesmo à medida que progride em cada instrução (se chamada várias vezes dentro da instrução).