PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona pg_sleep_until() in PostgreSQL

In PostgreSQL, puoi usare pg_sleep_until() funzione per ritardare l'esecuzione fino a un timestamp specificato.

Questo è utile quando si desidera un orario di sveglia specifico.

Nota che pg_sleep_until non è garantito che si svegli esattamente all'ora specificata, ma non si sveglierà prima.

Sintassi

La sintassi è questa:

pg_sleep_until(timestamp with time zone)

Esempio

Ecco un esempio per dimostrarne l'utilizzo.

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

Risultato (usando l'output verticale):

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

Ho usato clock_timestamp() in questo esempio, perché cambia durante l'esecuzione dell'istruzione. Questo ci consente di vedere i valori aggiornati man mano che l'istruzione avanza.

In questo esempio ho utilizzato la visualizzazione estesa (a volte indicata come "output verticale") per rendere più semplice la visualizzazione del risultato.

Puoi attivare la visualizzazione espansa in psql usando \x .

Esempio 2

Ecco un altro esempio, questa volta con una chiamata extra a pg_sleep_until() e clock_timestamp() .

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

Risultato (usando l'output 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

Esempio 3

In questo esempio, specifico esplicitamente la data/ora e l'offset del fuso orario.

Inoltre, eseguo la query dopo che è passato il primo timestamp. Quindi viene eseguito immediatamente.

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();

Risultato (usando l'output 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

Come mostra il risultato, non ho iniziato a eseguire la query fino a 17 secondi dopo il primo pg_sleep_until() value, quindi è stato eseguito immediatamente e ha utilizzato il timestamp al momento dell'esecuzione.

I miei timestamp erano tutti in rapida successione in questi esempi, perché non volevo aspettare ore o giorni solo per aggiornare questo articolo. Ma puoi andare avanti e specificare una data diversa, se necessario.