¿Cómo esperar 2 segundos?

187

¿Cómo se causa un retraso en la ejecución durante un número específico de segundos?

Esto no lo hace:

WAITFOR DELAY '00:02';

¿Cuál es el formato correcto?

Chad
fuente
El hilo parece estar esperando mucho más de 2 segundos. Me doy cuenta de que puede tardar más de 2 segundos para que el hilo continúe, pero tarda alrededor de 1 minuto cuando se ejecuta en un db local que solo estoy usando y no tengo ninguna otra actividad.
Chad
1
Esto realmente esperará exactamente 2 minutos.
Nick Chammas
2
posible duplicado del comando Sleep en T-SQL?
Jesse

Respuestas:

365

La documentación para WAITFOR() no presenta explícitamente el formato de cadena requerido.

Esto esperará 2 segundos:

WAITFOR DELAY '00:00:02';

El formato es hh:mi:ss.mmm.

Nick Chammas
fuente
99

Como se menciona en otras respuestas, todo lo siguiente funcionará para la sintaxis estándar basada en cadenas.

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

También hay un método alternativo para pasarle un DATETIMEvalor. Puede pensar que estoy confundiendo esto con WAITFOR TIME, pero también funciona WAITFOR DELAY.

Consideraciones para pasar DATETIME:

  • Se debe pasar como una variable, por lo que ya no es una buena frase.
  • El retraso se mide como el tiempo transcurrido desde la época ('1900-01-01' ).
  • Para situaciones que requieren una cantidad variable de retraso, es mucho más fácil manipular a DATETIMEque formatear correctamente a VARCHAR.

Cómo esperar 2 segundos:

--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

Una nota sobre la espera de TIMEvsDELAY :

¿Alguna vez has notado que si accidentalmente pasas WAITFOR TIMEuna fecha que ya pasó, incluso por solo un segundo, nunca volverá? Echale un vistazo:

--Example 3
DECLARE @Time1 DATETIME
SELECT @Time1 = getdate()
WAITFOR DELAY '00:00:01'
WAITFOR TIME @Time1 --WILL HANG FOREVER

Desafortunadamente, WAITFOR DELAYhará lo mismo si le pasa un DATETIMEvalor negativo (sí, eso es una cosa).

--Example 4
DECLARE @Delay3 DATETIME
SELECT @Delay3 = dateadd(SECOND, -1, convert(DATETIME, 0))
WAITFOR DELAY @Delay3 --WILL HANG FOREVER

Sin embargo, aún recomendaría usar WAITFOR DELAYdurante un tiempo estático porque siempre puede confirmar que su retraso es positivo y permanecerá así durante el tiempo que tarde su código en llegar a la WAITFORdeclaración.

RodeadoPor Peces
fuente
25

¿Qué tal esto?

WAITFOR DELAY '00:00:02';

Si tienes "00:02" está interpretando eso como Horas: Minutos.

JohnD
fuente
2

Prueba este ejemplo:

exec DBMS_LOCK.sleep(5);

Este es el guión completo:

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;
john m
fuente