2011-10-06 14 views
126

Jak spowodować opóźnienie w wykonaniu przez określoną liczbę sekund?Jak czekać przez 2 sekundy

nie zrobić:

WAITFOR DELAY '00:02'; 

Czy ktoś może mi pomóc z formatem?

+0

Nitka wydaje się czekać znacznie dłużej niż 2 sekundy. Zdaję sobie sprawę, że wątek może trwać dłużej niż 2 sekundy, ale trwa około 1 minuty, gdy uruchomiona jest lokalna baza danych, z której aktualnie korzystam i nie wykonuję żadnej innej czynności. – ChadD

+0

To rzeczywiście będzie czekać dokładnie 2 minuty. –

+2

możliwy duplikat [polecenia uśpienia w T-SQL?] (Http://stackoverflow.com/questions/664902/sleep-command-in-t-sql) – Jesse

Odpowiedz

241

The documentation for WAITFOR() nie określa w sposób jawny wymaganego formatu ciągu znaków.

To będzie czekać na 2 sekundy:

WAITFOR DELAY '00:00:02'; 

Format jest hh:mi:ss.mmm.

17

Co powiesz na to?

WAITFOR DELAY '00:00:02'; 

Jeśli masz "00:02", interpretujesz to jako godziny: minuty.

48

Jak wspomniano w innych odpowiedziach, wszystkie następujące czynności będą działać dla standardowej składni opartej na łańcuchach.

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 podania jej wartości DATETIME. Możesz pomyśleć, że pomylam to z WAITFOR TIME, ale działa również dla WAITFOR DELAY.

Rozważania dotyczące przechodzenia DATETIME:

  • To musi być przekazywana jako zmienna, więc to nie jest miły jeden-liner więcej.
  • Opóźnienie jest mierzone jako czas od zakończenia Epoki ('1900-01-01').
  • W sytuacjach wymagających zmiennej długości opóźnienia łatwiej jest manipulować wartością DATETIME niż poprawnie sformatować VARCHAR.

Jak odczekać 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 na oczekiwanie na TIME vs DELAY:

Czy zauważyłeś, że jeśli przypadkowo przechodzić WAITFOR TIME datę, która już minął, nawet przez sekundę, to nigdy nie wróci? Sprawdź:

--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 go przekazywać wartość ujemną DATETIME (tak, to jest rzeczą).

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

Jednak chciałbym jeszcze polecić użyciu WAITFOR DELAY na czas statycznym, ponieważ zawsze można potwierdzić swoją opóźnienie jest pozytywna i będzie to pobyt w ten sposób na jak długo to trwa, aby osiągnąć swój kod oświadczenie WAITFOR.

Powiązane problemy