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

Comment current_time fonctionne dans PostgreSQL

Dans PostgreSQL, le current_time La fonction renvoie l'heure actuelle, y compris le décalage horaire.

L'heure renvoyée est basée sur l'heure de début de la transaction en cours.

Syntaxe

Vous pouvez l'utiliser de l'une des manières suivantes :

current_time
current_time(x)

x est un paramètre de précision facultatif, qui entraîne l'arrondi du résultat à x nombre de chiffres fractionnaires dans le champ des secondes.

Sans paramètre de précision (la première syntaxe), le résultat est donné à la précision disponible complète.

Exemple – Précision totale

Voici un exemple de base pour démontrer un résultat en utilisant toute la précision disponible.

SELECT current_time;

Résultat :

14:33:30.731384+10

Exemple - Précision spécifique

Voici un exemple pour montrer comment spécifier la précision.

SELECT current_time(0);

Résultat :

15:35:38+10

Dans cet exemple, j'ai spécifié une précision de zéro, ce qui signifie qu'aucune fraction de seconde n'a été renvoyée.

Voici un autre exemple où je spécifie un nombre de fractions de seconde.

SELECT current_time(3);

Résultat :

15:37:43.385+10

Transactions

L'heure réelle est basée sur l'heure de début de la transaction en cours. Par conséquent, il 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.

Voici un exemple qui le démontre.

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

Voici la sortie complète de mon terminal lors de l'exécution de cette transaction dans psql :

postgres=# BEGIN;
BEGIN
postgres=# SELECT current_time;
    current_time    
--------------------
 09:09:27.524852+10
(1 row)


postgres=# SELECT pg_sleep(5);
SELECT current_time;
SELECT pg_sleep(5);
SELECT current_time;
COMMIT;
 pg_sleep 
----------
 
(1 row)


postgres=# SELECT current_time;
    current_time    
--------------------
 09:09:27.524852+10
(1 row)


postgres=# SELECT pg_sleep(5);
 pg_sleep 
----------
 
(1 row)


postgres=# SELECT current_time;
    current_time    
--------------------
 09:09:27.524852+10
(1 row)


postgres=# COMMIT;
COMMIT

Les trois valeurs de temps sont identiques, même si le pg_sleep() fonction a été utilisée pour retarder l'exécution entre chaque instruction dans la transaction.

Ceci est en contraste avec statement_timestamp() qui fait changer à chaque instruction.

Plusieurs appels dans un relevé

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

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

Résultat (en utilisant la sortie verticale) :

current_time | 09:11:16.09445+10
pg_sleep     | 
current_time | 09:11:16.09445+10
pg_sleep     | 
current_time | 09:11:16.09445+10

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 à current_time .

Ceci est en contraste avec le clock_timestamp() fonction, qui fait changer au fur et à mesure de sa progression dans l'instruction.

Au fait, j'ai utilisé la sortie verticale (également appelée sortie étendue) pour rendre les résultats légèrement plus compacts.

Vous pouvez basculer la sortie développée dans psql en utilisant \x .