如何等待2秒?

如何在执行中造成指定秒数的延迟?

这是不行的:

WAITFOR DELAY '00:02';

正确的格式是什么?

436793 次浏览

WAITFOR()的文档没有显式地布局所需的字符串格式。

这将等待2秒:

WAITFOR DELAY '00:00:02';

格式为hh:mi:ss.mmm

这个怎么样?

WAITFOR DELAY '00:00:02';

如果你有“00:02”,它会将其解释为“小时:分钟”。

正如在其他回答中提到的,以下所有方法都适用于基于字符串的标准语法。

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的注意事项:

  • 它必须作为变量传递,因此它不再是漂亮的一行程序。
  • 延迟被测量为自Epoch ('1900-01-01')以来的时间。
  • 对于需要可变延迟量的情况,操作DATETIME要比正确格式化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

关于等待TIMEDELAY的注意事项:

你有没有注意到,如果你不小心传递WAITFOR TIME一个已经传递的日期,即使只是一秒钟,它将永远不会返回?看看吧:

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

不幸的是,如果你传递给它一个负的DATETIME值,WAITFOR DELAY也会做同样的事情(是的,这是一个东西)。

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

然而,我仍然建议在静态时间内使用WAITFOR DELAY,因为你总是可以确认你的延迟是正的,无论你的代码到达WAITFOR语句需要多长时间,它都会保持这种状态。

试试这个例子:

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;