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