PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Funktionsweise von pg_sleep_until() in PostgreSQL

In PostgreSQL können Sie pg_sleep_until() verwenden Funktion, um die Ausführung bis zu einem bestimmten Zeitstempel zu verzögern.

Dies ist nützlich, wenn eine bestimmte Weckzeit gewünscht wird.

Beachten Sie, dass pg_sleep_until nicht garantiert genau zur angegebenen Zeit aufwacht, aber es wird nicht früher aufwachen.

Syntax

Die Syntax sieht so aus:

pg_sleep_until(timestamp with time zone)

Beispiel

Hier ist ein Beispiel, um die Verwendung zu demonstrieren.

\x
SELECT 
  clock_timestamp(),
  pg_sleep_until('today 15:30'),
  clock_timestamp();

Ergebnis (bei vertikaler Ausgabe):

clock_timestamp | 2020-06-28 15:29:54.564608+10
pg_sleep_until  |
clock_timestamp | 2020-06-28 15:30:00.0119+10

Ich habe clock_timestamp() verwendet in diesem Beispiel, weil es sich während der Anweisungsausführung ändert. Dadurch können wir die aktualisierten Werte sehen, während die Anweisung fortschreitet.

Ich habe in diesem Beispiel die erweiterte Anzeige (manchmal auch als „vertikale Ausgabe“ bezeichnet) verwendet, um das Ergebnis besser sichtbar zu machen.

Sie können die erweiterte Anzeige in psql umschalten, indem Sie \x verwenden .

Beispiel 2

Hier ist ein weiteres Beispiel, diesmal mit einem zusätzlichen Aufruf von pg_sleep_until() und clock_timestamp() .

SELECT 
  clock_timestamp(),
  pg_sleep_until('today 15:32'),
  clock_timestamp(),
  pg_sleep_until('today 15:33'),
  clock_timestamp();

Ergebnis (bei vertikaler Ausgabe):

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

Beispiel 3

In diesem Beispiel gebe ich Datum/Uhrzeit und Zeitzonen-Offset explizit an.

Außerdem führe ich die Abfrage aus, nachdem der erste Zeitstempel abgelaufen ist. Daher läuft es sofort.

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();

Ergebnis (bei vertikaler Ausgabe):

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

Wie das Ergebnis zeigt, habe ich die Abfrage erst 17 Sekunden nach dem ersten pg_sleep_until() ausgeführt Wert, und so wurde es sofort ausgeführt und verwendete den Zeitstempel zu der Zeit, als es ausgeführt wurde.

Meine Zeitstempel waren in diesen Beispielen alle schnell hintereinander, weil ich nicht Stunden oder Tage warten wollte, nur um diesen Artikel zu aktualisieren. Sie können jedoch bei Bedarf ein anderes Datum angeben.