PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como transaction_timestamp() funciona no PostgreSQL


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