W jaki sposób można spowodować opóźnienie wykonania o określoną liczbę sekund?
To nie wystarcza:
WAITFOR DELAY '00:02';
Jaki jest prawidłowy format?
W jaki sposób można spowodować opóźnienie wykonania o określoną liczbę sekund?
To nie wystarcza:
WAITFOR DELAY '00:02';
Jaki jest prawidłowy format?
Odpowiedzi:
Dokumentacja dlaWAITFOR()
nie określa jawnie wymaganego formatu ciągu.
To będzie czekać 2 sekundy:
WAITFOR DELAY '00:00:02';
Format to hh:mi:ss.mmm
.
Jak wspomniano w innych odpowiedziach, wszystkie poniższe będą działać dla standardowej składni opartej na ciągach.
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
Istnieje również alternatywna metoda przekazywania mu DATETIME
wartości. Możesz pomyśleć, że mylę to z WAITFOR TIME
, ale to też działa WAITFOR DELAY
.
Uwagi dotyczące zaliczenia DATETIME
:
'1900-01-01'
).DATETIME
niż prawidłowo formatować VARCHAR
.Jak czekać 2 sekundy:
--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
Uwaga dotycząca czekania na TIME
vs DELAY
:
Czy zauważyłeś kiedyś, że jeśli przypadkowo miniesz WAITFOR TIME
datę, która już minęła, nawet o sekundę, nigdy nie wróci? Sprawdź to:
--Example 3
DECLARE @Time1 DATETIME
SELECT @Time1 = getdate()
WAITFOR DELAY '00:00:01'
WAITFOR TIME @Time1 --WILL HANG FOREVER
Niestety, WAITFOR DELAY
zrobi to samo, jeśli przekażesz mu DATETIME
wartość ujemną (tak, to jest rzecz).
--Example 4
DECLARE @Delay3 DATETIME
SELECT @Delay3 = dateadd(SECOND, -1, convert(DATETIME, 0))
WAITFOR DELAY @Delay3 --WILL HANG FOREVER
Jednak nadal zalecałbym używanie WAITFOR DELAY
czasu statycznego, ponieważ zawsze możesz potwierdzić, że opóźnienie jest dodatnie i pozostanie takie przez tak długo, jak długo kod dotrze do WAITFOR
instrukcji.
Wypróbuj ten przykład:
exec DBMS_LOCK.sleep(5);
Oto cały skrypt:
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;