W PostgreSQL możesz użyć pg_sleep_until()
funkcja opóźniająca wykonanie do określonego znacznika czasu.
Jest to przydatne, gdy wymagany jest określony czas budzenia.
Zwróć uwagę, że pg_sleep_until
nie gwarantuje, że obudzi się dokładnie o określonej godzinie, ale nie obudzi się wcześniej.
Składnia
Składnia wygląda tak:
pg_sleep_until(timestamp with time zone)
Przykład
Oto przykład demonstrujący jego użycie.
\x
SELECT
clock_timestamp(),
pg_sleep_until('today 15:30'),
clock_timestamp();
Wynik (przy użyciu wyjścia pionowego):
clock_timestamp | 2020-06-28 15:29:54.564608+10 pg_sleep_until | clock_timestamp | 2020-06-28 15:30:00.0119+10
Użyłem clock_timestamp()
w tym przykładzie, ponieważ zmienia się podczas wykonywania instrukcji. Dzięki temu możemy zobaczyć zaktualizowane wartości w miarę postępów w instrukcji.
Użyłem rozszerzonego wyświetlania (czasami określanego jako „wyjście pionowe”) w tym przykładzie, aby ułatwić zobaczenie wyniku.
Możesz przełączać rozszerzone wyświetlanie w psql za pomocą \x
.
Przykład 2
Oto kolejny przykład, tym razem z dodatkowym wywołaniem pg_sleep_until()
i clock_timestamp()
.
SELECT
clock_timestamp(),
pg_sleep_until('today 15:32'),
clock_timestamp(),
pg_sleep_until('today 15:33'),
clock_timestamp();
Wynik (przy użyciu wyjścia pionowego):
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
Przykład 3
W tym przykładzie wyraźnie określam datę/godzinę i przesunięcie strefy czasowej.
Ponadto uruchamiam zapytanie po upływie pierwszego znacznika czasu. Dlatego działa natychmiast.
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();
Wynik (przy użyciu wyjścia pionowego):
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 pokazuje wynik, nie zacząłem wykonywać zapytania do 17 sekund po pierwszej pg_sleep_until()
wartość, więc uruchomił się natychmiast i użył sygnatury czasowej w momencie uruchomienia.
W tych przykładach wszystkie moje znaczniki czasu pojawiały się szybko po sobie, ponieważ nie chciałem czekać godzinami lub dniami tylko na aktualizację tego artykułu. Ale możesz śmiało określić inną datę, jeśli jest to wymagane.