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

Como o Now() funciona no PostgreSQL


No PostgreSQL, o now() 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 a transaction_timestamp() função.

Também é semelhante ao current_timestamp função (quando chamado sem um argumento).

O now() 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, now() não é padrão SQL (assim como o transaction_timestamp() função).

Sintaxe


A sintaxe fica assim:
now()

Nenhum argumento é necessário ou aceito.

Exemplo básico


Aqui está um exemplo básico para demonstrar.
SELECT now();

Resultado:
2020-07-02 09:51:12.088506+10

Dentro de uma transação


Aqui está um exemplo para demonstrar como funciona dentro de uma transação.
BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;

Aqui está a saída completa dentro do meu terminal ao usar o 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

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 now() , 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 
  now(),
  pg_sleep(5),
  now(),
  pg_sleep(5),
  now();

Resultado (usando saída vertical):
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

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

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