如何在执行中造成指定秒数的延迟?
这是不行的:
WAITFOR DELAY '00:02';
正确的格式是什么?
如何在执行中造成指定秒数的延迟?
这是不行的:
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。
这个怎么样?
WAITFOR DELAY '00:00:02';
如果你有“00:02”,它会将其解释为“小时:分钟”。
试试这个例子:
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 '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语句,它都将保持这种状态。