Як чекати 2 секунди?


187

Як можна викликати затримку виконання на певну кількість секунд?

Це не робить:

WAITFOR DELAY '00:02';

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


Здається, нитка чекає набагато довше, ніж 2 секунди. Я усвідомлюю, що продовження потоку може зайняти більше 2 секунд, але це працює близько 1 хв при запуску на локальний db, який я, очевидно, використовую, і не має іншої активності.
Чад

1
Насправді це чекатиме рівно 2 хвилини.
Нік Чаммас

2
можливий дублікат Sleep Command в T-SQL?
Джессі

Відповіді:



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заяви.


25

Як щодо цього?

WAITFOR DELAY '00:00:02';

Якщо у вас є "00:02", це трактується як Години: Хвилини.


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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.