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.