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

Comment Now() fonctionne dans PostgreSQL

Dans PostgreSQL, le now() 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 transaction_timestamp() fonction.

Il est également similaire au current_timestamp fonction (lorsqu'elle est appelée sans argument).

Le now() 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, now() n'est pas standard SQL (tout comme transaction_timestamp() fonction).

Syntaxe

La syntaxe ressemble à ceci :

now()

Aucun argument n'est requis ou accepté.

Exemple de base

Voici un exemple de base pour illustrer.

SELECT now();

Résultat :

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

Dans le cadre d'une transaction

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

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

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

Les trois valeurs de temps sont identiques, même si le pg_sleep() la fonction était utilisée pour retarder l'exécution entre chaque appel à now() , 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 
  now(),
  pg_sleep(5),
  now(),
  pg_sleep(5),
  now();

Résultat (en utilisant la sortie verticale) :

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

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

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