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 dla
WAITFOR()
nie określa jawnie wymaganego formatu ciągu.To będzie czekać 2 sekundy:
Format to
hh:mi:ss.mmm
.źródło
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 zWAITFOR TIME
, ale to też działaWAITFOR 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
vsDELAY
: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 muDATETIME
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 doWAITFOR
instrukcji.źródło
Co powiesz na to?
Jeśli masz „00:02”, interpretuje to jako godziny: minuty.
źródło
Wypróbuj ten przykład:
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;
źródło