In PostgreSQL kunt u de pg_sleep_until()
functie om de uitvoering uit te stellen tot een opgegeven tijdstempel.
Dit is handig wanneer een specifieke wektijd gewenst is.
Merk op dat pg_sleep_until
wordt niet gegarandeerd precies op de opgegeven tijd wakker, maar het zal niet eerder wakker worden.
Syntaxis
De syntaxis gaat als volgt:
pg_sleep_until(timestamp with time zone)
Voorbeeld
Hier is een voorbeeld om het gebruik te demonstreren.
\x
SELECT
clock_timestamp(),
pg_sleep_until('today 15:30'),
clock_timestamp();
Resultaat (met verticale uitvoer):
clock_timestamp | 2020-06-28 15:29:54.564608+10 pg_sleep_until | clock_timestamp | 2020-06-28 15:30:00.0119+10
Ik gebruikte clock_timestamp()
in dit voorbeeld, omdat het verandert tijdens de uitvoering van de instructie. Hierdoor kunnen we de bijgewerkte waarden zien naarmate het statement vordert.
Ik heb in dit voorbeeld een uitgebreide weergave gebruikt (soms "verticale uitvoer" genoemd) om het resultaat gemakkelijker te kunnen zien.
U kunt de uitgebreide weergave in psql schakelen met \x
.
Voorbeeld 2
Hier is nog een voorbeeld, dit keer met een extra aanroep naar pg_sleep_until()
en clock_timestamp()
.
SELECT
clock_timestamp(),
pg_sleep_until('today 15:32'),
clock_timestamp(),
pg_sleep_until('today 15:33'),
clock_timestamp();
Resultaat (met verticale uitvoer):
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
Voorbeeld 3
In dit voorbeeld specificeer ik expliciet de datum/tijd en tijdzone-offset.
Ook voer ik de query uit nadat de eerste tijdstempel is verstreken. Daarom draait het direct.
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();
Resultaat (met verticale uitvoer):
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
Zoals het resultaat laat zien, begon ik de query pas 17 seconden na de eerste pg_sleep_until()
uit te voeren waarde, en dus liep het onmiddellijk en gebruikte het de tijdstempel op het moment dat het liep.
Mijn tijdstempels waren allemaal snel achter elkaar in deze voorbeelden, omdat ik geen uren of dagen wilde wachten om dit artikel bij te werken. Maar u kunt indien nodig doorgaan en een andere datum opgeven.