Wie 2 Sekunden warten?

184

Wie verursacht man eine Verzögerung der Ausführung für eine bestimmte Anzahl von Sekunden?

Das macht es nicht:

WAITFOR DELAY '00:02';

Was ist das richtige Format?

Tschad
quelle
Der Thread scheint viel länger als 2 Sekunden zu warten. Mir ist klar, dass es länger als 2 Sekunden dauern kann, bis der Thread fortgesetzt wird, aber es dauert ungefähr 1 Minute, wenn er auf einer lokalen Datenbank ausgeführt wird, die ich gerade verwende und für die keine andere Aktivität ausgeführt wird.
Tschad
1
Dies wird tatsächlich genau 2 Minuten warten.
Nick Chammas
2
Mögliches Duplikat des Sleep-Befehls in T-SQL?
Jesse

Antworten:

359

In der Dokumentation zuWAITFOR() ist das erforderliche Zeichenfolgenformat nicht explizit angegeben.

Dies wird 2 Sekunden warten:

WAITFOR DELAY '00:00:02';

Das Format ist hh:mi:ss.mmm.

Nick Chammas
quelle
98

Wie in anderen Antworten erwähnt, funktionieren alle folgenden Punkte für die standardmäßige stringbasierte Syntax.

WAITFOR DELAY '02:00' --Two hours
WAITFOR DELAY '00:02' --Two minutes
WAITFOR DELAY '00:00:02' --Two seconds
WAITFOR DELAY '00:00:00.200' --Two tenths of a seconds

Es gibt auch eine alternative Methode, um einen DATETIMEWert zu übergeben. Du denkst vielleicht, ich verwechsle das damit WAITFOR TIME, aber es funktioniert auch für WAITFOR DELAY.

Überlegungen zum Bestehen DATETIME:

  • Es muss als Variable übergeben werden, es ist also kein netter Einzeiler mehr.
  • Die Verzögerung wird als die Zeit seit der Epoche gemessen ('1900-01-01' ) .
  • In Situationen, in denen eine variable Verzögerung erforderlich ist, ist es viel einfacher, a zu manipulieren, DATETIMEals a richtig zu formatieren VARCHAR.

So warten Sie 2 Sekunden:

--Example 1
DECLARE @Delay1 DATETIME
SELECT @Delay1 = '1900-01-01 00:00:02.000'
WAITFOR DELAY @Delay1

--Example 2
DECLARE @Delay2 DATETIME
SELECT @Delay2 = dateadd(SECOND, 2, convert(DATETIME, 0))
WAITFOR DELAY @Delay2

Ein Hinweis zum Warten auf TIMEvs DELAY:

Haben Sie jemals bemerkt, WAITFOR TIMEdass ein bereits verstrichenes Datum, selbst wenn es nur eine Sekunde dauert, niemals zurückkehren wird? Hör zu:

--Example 3
DECLARE @Time1 DATETIME
SELECT @Time1 = getdate()
WAITFOR DELAY '00:00:01'
WAITFOR TIME @Time1 --WILL HANG FOREVER

Leider WAITFOR DELAYwird das gleiche tun, wenn Sie einen negativen DATETIMEWert übergeben (ja, das ist eine Sache).

--Example 4
DECLARE @Delay3 DATETIME
SELECT @Delay3 = dateadd(SECOND, -1, convert(DATETIME, 0))
WAITFOR DELAY @Delay3 --WILL HANG FOREVER

Ich würde jedoch weiterhin die Verwendung WAITFOR DELAYüber einen statischen Zeitraum empfehlen, da Sie jederzeit bestätigen können, dass Ihre Verzögerung positiv ist und dies so lange so bleibt, wie Ihr Code benötigt, um die WAITFORAnweisung zu erreichen .

SurroundedByFish
quelle
25

Wie wäre es damit?

WAITFOR DELAY '00:00:02';

Wenn Sie "00:02" haben, wird dies als Stunden: Minuten interpretiert.

JohnD
quelle
2

Versuchen Sie dieses Beispiel:

exec DBMS_LOCK.sleep(5);

Das ist das ganze Skript:

SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "Start Date / Time" FROM DUAL;

exec DBMS_LOCK.sleep(5);

SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "End Date / Time" FROM DUAL;
John M.
quelle