sql >> Databáze >  >> RDS >> PostgreSQL

Jak funguje pg_sleep_until() v PostgreSQL

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.


  1. Microsoft Access – základy

  2. Kopírování dat ze souboru do CLOB v Oracle

  3. IntegrityError:rozlišujte mezi jedinečným omezením a nenulovým porušením

  4. Manipulace s potvrzením e-mailu během registrace v baňce