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

Comment pg_sleep_until() fonctionne dans PostgreSQL

Dans PostgreSQL, vous pouvez utiliser le pg_sleep_until() fonction pour retarder l'exécution jusqu'à un horodatage spécifié.

Ceci est utile lorsqu'une heure de réveil spécifique est souhaitée.

Notez que pg_sleep_until n'est pas garanti de se réveiller exactement à l'heure spécifiée, mais il ne se réveillera pas plus tôt.

Syntaxe

La syntaxe ressemble à ceci :

pg_sleep_until(timestamp with time zone)

Exemple

Voici un exemple pour démontrer son utilisation.

\x
SELECT 
  clock_timestamp(),
  pg_sleep_until('today 15:30'),
  clock_timestamp();

Résultat (en utilisant la sortie verticale) :

clock_timestamp | 2020-06-28 15:29:54.564608+10
pg_sleep_until  |
clock_timestamp | 2020-06-28 15:30:00.0119+10

J'ai utilisé clock_timestamp() dans cet exemple, car il change pendant l'exécution de l'instruction. Cela nous permet de voir les valeurs mises à jour au fur et à mesure que l'instruction progresse.

J'ai utilisé l'affichage étendu (parfois appelé "sortie verticale") dans cet exemple afin de faciliter la visualisation du résultat.

Vous pouvez basculer l'affichage étendu dans psql en utilisant \x .

Exemple 2

Voici un autre exemple, cette fois avec un appel supplémentaire à pg_sleep_until() et clock_timestamp() .

SELECT 
  clock_timestamp(),
  pg_sleep_until('today 15:32'),
  clock_timestamp(),
  pg_sleep_until('today 15:33'),
  clock_timestamp();

Résultat (en utilisant la sortie verticale) :

clock_timestamp | 2020-06-28 15:31:23.142358+10
pg_sleep_until  |
clock_timestamp | 2020-06-28 15:32:00.061566+10
pg_sleep_until  |
clock_timestamp | 2020-06-28 15:33:00.074381+10

Exemple 3

Dans cet exemple, je spécifie explicitement la date/heure et le décalage horaire.

De plus, j'exécute la requête après le premier horodatage. Par conséquent, il s'exécute immédiatement.

SELECT 
  clock_timestamp(),
  pg_sleep_until('2020-06-29 08:54:00.000000+10'),
  clock_timestamp(),
  pg_sleep_until('2020-06-29 08:55:00.000000+10'),
  clock_timestamp();

Résultat (en utilisant la sortie verticale) :

clock_timestamp | 2020-06-29 08:54:17.189189+10
pg_sleep_until  |
clock_timestamp | 2020-06-29 08:54:17.189196+10
pg_sleep_until  |
clock_timestamp | 2020-06-29 08:55:00.062783+10

Comme le résultat le montre, je n'ai commencé à exécuter la requête que 17 secondes après le premier pg_sleep_until() valeur, et donc il s'est exécuté immédiatement et a utilisé l'horodatage au moment de son exécution.

Mes horodatages se succédaient rapidement dans ces exemples, car je ne voulais pas attendre des heures ou des jours juste pour mettre à jour cet article. Mais vous pouvez continuer et spécifier une date différente si nécessaire.