sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo funciona Now() en PostgreSQL

En PostgreSQL, now() La función devuelve la fecha y la hora actuales (incluida la compensación de la zona horaria), al comienzo de la transacción actual.

Es el equivalente de transaction_timestamp() función.

También es similar al current_timestamp función (cuando se llama sin un argumento).

El now() la función no acepta ningún parámetro, por lo que no puede especificar su precisión, mientras que current_timestamp se puede llamar con o sin un parámetro de precisión.

Además, now() no es estándar de SQL (al igual que transaction_timestamp() función).

Sintaxis

La sintaxis es así:

now()

No se requieren ni se aceptan argumentos.

Ejemplo básico

Aquí hay un ejemplo básico para demostrarlo.

SELECT now();

Resultado:

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

Dentro de una transacción

Aquí hay un ejemplo para demostrar cómo funciona dentro de una transacción.

BEGIN;
SELECT now();
SELECT pg_sleep(5);
SELECT now();
SELECT pg_sleep(5);
SELECT now();
COMMIT;

Aquí está el resultado completo dentro de mi terminal cuando uso 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

Los tres valores de tiempo son idénticos, aunque pg_sleep() se usó la función para retrasar la ejecución entre cada llamada a now() , cada uno de los cuales estaba en su propia instrucción SQL.

Entonces podemos ver que el tiempo devuelto para cada declaración se basa en la hora de inicio de la transacción actual, no en la declaración. No cambia a medida que avanza la transacción.

Esto permite que una sola transacción tenga una noción consistente de la hora "actual", de modo que múltiples modificaciones dentro de la misma transacción lleven la misma marca de tiempo.

Múltiples llamadas dentro de una declaración

Tampoco cambia a medida que avanza la declaración.

\x
SELECT 
  now(),
  pg_sleep(5),
  now(),
  pg_sleep(5),
  now();

Resultado (usando salida 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

De nuevo, los tres valores de tiempo son idénticos, aunque pg_sleep() se usó la función para retrasar la ejecución entre cada llamada a now() .

Esto contrasta con statement_timestamp() , que cambiar con cada declaración, y también el clock_timestamp() función, que cambia incluso a medida que avanza a través de cada declaración (si se llama varias veces dentro de la declaración).