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?
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?
Risposte:
La documentazione perWAITFOR()
non espone esplicitamente il formato stringa richiesto.
Questo attenderà 2 secondi:
WAITFOR DELAY '00:00:02';
Il formato è hh:mi:ss.mmm
.
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 DATETIME
valore. Potresti pensare che lo stia confondendo WAITFOR TIME
, ma funziona anche per WAITFOR DELAY
.
Considerazioni per il passaggio DATETIME
:
'1900-01-01'
).DATETIME
che 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 TIME
vs DELAY
:
Hai mai notato che se accidentalmente passi WAITFOR TIME
una 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 DELAY
farà la stessa cosa se gli passi un DATETIME
valore 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 DELAY
un 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 WAITFOR
dichiarazione.
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;