Как ждать 2 секунды?

187

Как вызвать задержку выполнения на указанное количество секунд?

Это не делает это:

WAITFOR DELAY '00:02';

Какой правильный формат?

Чад
источник
Кажется, что нить ждет намного дольше 2 секунд. Я понимаю, что для продолжения потока может потребоваться более 2 секунд, но это занимает около 1 минуты при работе на локальном БД, который, как правило, я использую и не выполняет никаких других действий.
Чад
1
Это на самом деле подождет ровно 2 минуты.
Ник Чаммас
2
возможный дубликат Sleep Command в T-SQL?
Джесси

Ответы:

365

В документацииWAITFOR() явно не указан требуемый формат строки.

Это будет ждать 2 секунды:

WAITFOR DELAY '00:00:02';

Формат есть hh:mi:ss.mmm.

Ник Чаммас
источник
99

Как уже упоминалось в других ответах, все следующее будет работать для стандартного синтаксиса на основе строк.

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

Существует также альтернативный метод передачи ему DATETIMEзначения. Вы можете подумать, что я путаю это с WAITFOR TIME, но это тоже работает WAITFOR DELAY.

Соображения для прохождения DATETIME:

  • Он должен быть передан как переменная, поэтому он больше не является хорошим однострочным.
  • Задержка измеряется как время с начала эпохи ( '1900-01-01').
  • В ситуациях, когда требуется переменная величина задержки, манипулировать a намного проще, DATETIMEчем правильно форматировать a VARCHAR.

Как ждать 2 секунды:

--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

Примечание о ожидании TIMEпротив DELAY:

Вы когда-нибудь замечали, что если вы случайно пройдете WAITFOR TIMEдату, которая уже прошла, хотя бы на секунду, она никогда не вернется? Проверьте это:

--Example 3
DECLARE @Time1 DATETIME
SELECT @Time1 = getdate()
WAITFOR DELAY '00:00:01'
WAITFOR TIME @Time1 --WILL HANG FOREVER

К сожалению, WAITFOR DELAYбудет делать то же самое, если вы передадите ему отрицательное DATETIMEзначение (да, это вещь).

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

Тем не менее, я бы по-прежнему рекомендовал использовать в WAITFOR DELAYтечение статического времени, потому что вы всегда можете подтвердить, что ваша задержка положительна, и она останется такой, сколько бы времени ни потребовалось вашему коду, чтобы достичь WAITFORутверждения.

SurroundedByFish
источник
25

Как насчет этого?

WAITFOR DELAY '00:00:02';

Если у вас есть «00:02», это означает, что часы: минуты.

JohnD
источник
2

Попробуйте этот пример:

exec DBMS_LOCK.sleep(5);

Это весь сценарий:

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;
Джон М
источник