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