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

这是不行的:

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

它必须作为变量传递,因此它不再是漂亮的一行程序。 延迟是用自大纪元(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

关于等待时间和延迟的注意事项:

你是否注意到,如果你不小心将一个已经经过的日期传递给了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语句,它都将保持这种状态。

其他回答

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

这将等待2秒:

WAITFOR DELAY '00:00:02';

格式为hh:mi:ss.mmm。

试试这个例子:

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;

这个怎么样?

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

它必须作为变量传递,因此它不再是漂亮的一行程序。 延迟是用自大纪元(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

关于等待时间和延迟的注意事项:

你是否注意到,如果你不小心将一个已经经过的日期传递给了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语句,它都将保持这种状态。