【问题标题】:How to wait for 2 seconds?如何等待2秒?
【发布时间】:2011-12-02 08:00:44
【问题描述】:

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

这不行:

WAITFOR DELAY '00:02';

正确的格式是什么?

【问题讨论】:

  • 线程等待的时间似乎超过 2 秒。我意识到线程可能需要超过 2 秒才能继续,但是在我正在使用且没有其他活动的本地数据库上运行时大约需要 1 分钟。
  • 这实际上会等待 2 分钟。
  • Sleep Command in T-SQL?的可能重复

标签: sql-server sql-server-2008 tsql


【解决方案1】:

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

这将等待 2 秒:

WAITFOR DELAY '00:00:02';

格式为hh:mi:ss.mmm

【讨论】:

    【解决方案2】:

    这个怎么样?

    WAITFOR DELAY '00:00:02';
    

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

    【讨论】:

      【解决方案3】:

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

      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 语句需要多长时间,它都会保持这种状态。

      【讨论】:

        【解决方案4】:

        试试这个例子:

        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;
        

        【讨论】:

        • 对不起。这是什么风格的 SQL?
        • 看起来像 Oracle,基于对“DBMS_LOCK.sleep”的快速 Google 搜索。
        猜你喜欢
        • 2023-03-20
        • 2013-11-13
        • 1970-01-01
        • 2021-10-13
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        相关资源
        最近更新 更多