Come aspettare 2 secondi?


187

Come si può causare un ritardo nell'esecuzione per un determinato numero di secondi?

Questo non lo fa:

WAITFOR DELAY '00:02';

Qual è il formato corretto?


Il thread sembra attendere molto più di 2 secondi. Mi rendo conto che potrebbero volerci più di 2 secondi per continuare il thread, ma ci vogliono circa 1 minuto quando corro su un db locale che sto usando e non ho altre attività.
Chad,

1
Questo in realtà attenderà esattamente 2 minuti.
Nick Chammas,

2
possibile duplicato del comando Sleep in T-SQL?
Jesse,

Risposte:



99

Come menzionato in altre risposte, tutto quanto segue funzionerà per la sintassi standard basata su stringhe.

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

Esiste anche un metodo alternativo per passargli un DATETIMEvalore. Potresti pensare che lo stia confondendo WAITFOR TIME, ma funziona anche per WAITFOR DELAY.

Considerazioni per il passaggio DATETIME:

  • Deve essere passato come variabile, quindi non è più un buon one-liner.
  • Il ritardo è misurato come il tempo trascorso dall'epoca ( '1900-01-01').
  • Per situazioni che richiedono una quantità variabile di ritardo, è molto più facile manipolare un DATETIMEche formattare correttamente un VARCHAR.

Come attendere 2 secondi:

--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

Una nota sull'attesa per TIMEvs DELAY:

Hai mai notato che se accidentalmente passi WAITFOR TIMEuna data già passata, anche solo per un secondo, non tornerà mai più? Controlla:

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

Sfortunatamente, WAITFOR DELAYfarà la stessa cosa se gli passi un DATETIMEvalore negativo (sì, è una cosa).

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

Tuttavia, ti consiglierei comunque di utilizzare WAITFOR DELAYun tempo statico perché puoi sempre confermare che il tuo ritardo è positivo e rimarrà tale per tutto il tempo necessario al tuo codice per raggiungere la WAITFORdichiarazione.


25

Cosa ne pensi di questo?

WAITFOR DELAY '00:00:02';

Se hai "00:02" lo sta interpretando come Ore: Minuti.


2

Prova questo esempio:

exec DBMS_LOCK.sleep(5);

Questo è l'intero script:

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.