V PostgreSQL můžete použít pg_sleep_until()
funkce pro odložení provedení až do zadaného časového razítka.
To je užitečné, když je požadována konkrétní doba probuzení.
Všimněte si, že pg_sleep_until
není zaručeno, že se probudí přesně v určený čas, ale neprobudí se dříve.
Syntaxe
Syntaxe vypadá takto:
pg_sleep_until(timestamp with time zone)
Příklad
Zde je příklad, který demonstruje jeho použití.
\x
SELECT
clock_timestamp(),
pg_sleep_until('today 15:30'),
clock_timestamp();
Výsledek (při použití vertikálního výstupu):
clock_timestamp | 2020-06-28 15:29:54.564608+10 pg_sleep_until | clock_timestamp | 2020-06-28 15:30:00.0119+10
Použil jsem clock_timestamp()
v tomto příkladu, protože se mění během provádění příkazu. To nám umožňuje vidět aktualizované hodnoty v průběhu příkazu.
V tomto příkladu jsem použil rozšířené zobrazení (někdy označované jako „vertikální výstup“), aby bylo snazší vidět výsledek.
Rozšířené zobrazení v psql můžete přepínat pomocí \x
.
Příklad 2
Zde je další příklad, tentokrát s dalším voláním funkce pg_sleep_until()
a clock_timestamp()
.
SELECT
clock_timestamp(),
pg_sleep_until('today 15:32'),
clock_timestamp(),
pg_sleep_until('today 15:33'),
clock_timestamp();
Výsledek (při použití vertikálního výstupu):
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
Příklad 3
V tomto příkladu výslovně specifikuji posun data/času a časového pásma.
Dotaz také spustím po uplynutí prvního časového razítka. Proto běží okamžitě.
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();
Výsledek (při použití vertikálního výstupu):
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
Jak ukazuje výsledek, dotaz jsem nezačal spouštět dříve než 17 sekund po prvním pg_sleep_until()
hodnotu, a tak se okamžitě spustil a použil časové razítko v době, kdy běžel.
Moje časová razítka byla v těchto příkladech všechna v rychlém sledu, protože jsem nechtěl čekat hodiny nebo dny, abych aktualizoval tento článek. V případě potřeby však můžete pokračovat a zadat jiné datum.