Jak czekać 2 sekundy?

197

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?

Czad
źródło
1
Wątek wydaje się czekać znacznie dłużej niż 2 sekundy. Zdaję sobie sprawę, że kontynuowanie wątku może zająć dłużej niż 2 sekundy, ale w przypadku uruchamiania na lokalnej bazie danych, której używam i nie wykonuję żadnej innej aktywności, zajmuje to około 1 minuty.
Czad
1
To faktycznie będzie czekać dokładnie 2 minuty.
Nick Chammas
2
możliwy duplikat polecenia uśpienia w T-SQL?
Jesse

Odpowiedzi:

384

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.

Nick Chammas
źródło
104

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 DATETIMEwartości. Możesz pomyśleć, że mylę to z WAITFOR TIME, ale to też działa WAITFOR DELAY.

Uwagi dotyczące zaliczenia DATETIME:

  • Musi być przekazywana jako zmienna, więc nie jest już ładną jednowierszową.
  • Opóźnienie jest mierzone jako czas od Epoki ( '1900-01-01').
  • W sytuacjach, które wymagają zmiennej ilości opóźnienia, o wiele łatwiej jest manipulować a DATETIMEniż 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 TIMEvs DELAY:

Czy zauważyłeś kiedyś, że jeśli przypadkowo miniesz WAITFOR TIMEdatę, 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 DELAYzrobi to samo, jeśli przekażesz mu DATETIMEwartość 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 DELAYczasu statycznego, ponieważ zawsze możesz potwierdzić, że opóźnienie jest dodatnie i pozostanie takie przez tak długo, jak długo kod dotrze do WAITFORinstrukcji.

SurroundedByFish
źródło
27

Co powiesz na to?

WAITFOR DELAY '00:00:02';

Jeśli masz „00:02”, interpretuje to jako godziny: minuty.

JohnD
źródło
2

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;
john m
źródło
Przepraszam. jaki to jest rodzaj SQL?
deutschZuid