怎么等待2秒?

问题描述 投票:155回答:4

如何在指定的秒数内导致延迟执行?

这不是这样的:

WAITFOR DELAY '00:02';

什么是正确的格式?

sql-server sql-server-2008 tsql
4个回答
299
投票

The documentation for WAITFOR()没有明确规定所需的字符串格式。

这将等待2秒钟:

WAITFOR DELAY '00:00:02';

格式是hh:mi:ss.mmm


78
投票

如其他答案中所述,以下所有内容都适用于标准的基于字符串的语法。

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')以来的时间。
  • 对于需要不同延迟量的情况,操纵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

不幸的是,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语句,它就会保持这种状态。


21
投票

这个怎么样?

WAITFOR DELAY '00:00:02';

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


1
投票

试试这个例子:

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;