PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fonctionnement de transaction_timestamp() dans PostgreSQL

Dans PostgreSQL, le transaction_timestamp() renvoie la date et l'heure actuelles (y compris le décalage horaire) au début de la transaction en cours.

C'est l'équivalent de la fonction Postgres traditionnelle now() .

Il est également similaire au current_timestamp fonction (lorsqu'elle est appelée sans argument), sauf qu'elle est nommée pour refléter clairement ce qu'elle fait.

Le transaction_timestamp() la fonction n'accepte aucun paramètre, vous ne pouvez donc pas spécifier sa précision, alors que current_timestamp peut être appelé avec ou sans paramètre de précision.

Aussi, transaction_timestamp() est une fonction non standard SQL.

Syntaxe

La syntaxe ressemble à ceci :

transaction_timestamp()

Aucun argument n'est requis ou accepté.

Exemple de base

Voici un exemple de base pour illustrer.

SELECT transaction_timestamp();

Résultat :

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

Dans le cadre d'une transaction

Voici un exemple pour montrer comment cela fonctionne dans une transaction.

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

Voici la sortie complète dans mon terminal lors de l'utilisation de 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

Les trois valeurs de temps sont identiques, même si le pg_sleep() la fonction a été utilisée pour retarder l'exécution entre chaque appel à transaction_timestamp() , chacun d'entre eux se trouvant dans sa propre instruction SQL.

Nous pouvons donc voir que l'heure renvoyée pour chaque instruction est basée sur l'heure de début de la transaction en cours, et non sur l'instruction. Cela ne change pas au fur et à mesure que la transaction progresse.

Cela permet à une seule transaction d'avoir une notion cohérente de l'heure "actuelle", de sorte que plusieurs modifications au sein d'une même transaction portent le même horodatage.

Plusieurs appels dans un relevé

Cela ne change pas non plus au fur et à mesure que la déclaration progresse.

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

Résultat (en utilisant la sortie verticale) :

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

Encore une fois, les trois valeurs de temps sont identiques, même si le pg_sleep() la fonction a été utilisée pour retarder l'exécution entre chaque appel à transaction_timestamp() .

Ceci est en contraste avec statement_timestamp() , ce qui fait changer à chaque instruction, ainsi que le clock_timestamp() fonction, qui change au fur et à mesure qu'elle progresse dans chaque instruction (si elle est appelée plusieurs fois dans l'instruction).