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

Cómo funciona transaction_timestamp() en PostgreSQL

En PostgreSQL, el transaction_timestamp() 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 la función tradicional de Postgres now() .

También es similar al current_timestamp función (cuando se llama sin un argumento), excepto que se nombra para reflejar claramente lo que hace.

El transaction_timestamp() 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, transaction_timestamp() es una función no estándar de SQL.

Sintaxis

La sintaxis es así:

transaction_timestamp()

No se requieren ni se aceptan argumentos.

Ejemplo básico

Aquí hay un ejemplo básico para demostrarlo.

SELECT transaction_timestamp();

Resultado:

2020-07-02 08:23:08.810484+10

Dentro de una transacción

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

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

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

Los tres valores de tiempo son idénticos, aunque pg_sleep() La función se usó para retrasar la ejecución entre cada llamada a transaction_timestamp() , 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 
  transaction_timestamp(),
  pg_sleep(5),
  transaction_timestamp(),
  pg_sleep(5),
  transaction_timestamp();

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

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

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