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