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