В PostgreSQL можете да използвате pg_sleep_until()
функция за забавяне на изпълнението до определен времеви печат.
Това е полезно, когато се желае точно определено време за събуждане.
Имайте предвид, че pg_sleep_until
не е гарантирано, че ще се събуди точно в определеното време, но няма да се събуди по-рано.
Синтаксис
Синтаксисът е така:
pg_sleep_until(timestamp with time zone)
Пример
Ето пример за демонстриране на използването му.
\x
SELECT
clock_timestamp(),
pg_sleep_until('today 15:30'),
clock_timestamp();
Резултат (с помощта на вертикален изход):
clock_timestamp | 2020-06-28 15:29:54.564608+10 pg_sleep_until | clock_timestamp | 2020-06-28 15:30:00.0119+10
Използвах clock_timestamp()
в този пример, защото се променя по време на изпълнение на оператор. Това ни позволява да видим актуализираните стойности с напредването на изявлението.
Използвах разширен дисплей (понякога наричан „вертикален изход“) в този пример, за да улесня виждането на резултата.
Можете да превключвате разширеното показване в psql, като използвате \x
.
Пример 2
Ето още един пример, този път с допълнително извикване на pg_sleep_until()
и clock_timestamp()
.
SELECT
clock_timestamp(),
pg_sleep_until('today 15:32'),
clock_timestamp(),
pg_sleep_until('today 15:33'),
clock_timestamp();
Резултат (с помощта на вертикален изход):
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
Пример 3
В този пример изрично посочвам датата/часа и отместването на часовата зона.
Също така, стартирам заявката след изтичане на първото клеймо за време. Поради това работи незабавно.
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();
Резултат (с помощта на вертикален изход):
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
Както показва резултатът, започнах да изпълнявам заявката до 17 секунди след първия pg_sleep_until()
стойност, и така се стартира незабавно и използва времевата марка в момента, в който се изпълнява.
Моите времеви марки бяха в бърза последователност в тези примери, защото не исках да чакам часове или дни само за да актуализирам тази статия. Но можете да продължите и да посочите друга дата, ако е необходимо.