如何在执行中造成指定秒数的延迟?
这是不行的:
WAITFOR DELAY '00:02';
正确的格式是什么?
WAITFOR()的文档没有显式地布局所需的字符串格式。
WAITFOR()
这将等待2秒:
WAITFOR DELAY '00:00:02';
格式为hh:mi:ss.mmm。
hh:mi:ss.mmm
这个怎么样?
如果你有“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
WAITFOR TIME
WAITFOR DELAY
传递DATETIME的注意事项:
'1900-01-01'
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的注意事项:
TIME
DELAY
你有没有注意到,如果你不小心传递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
试试这个例子:
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;