Como esperar por 2 segundos?

187

Como causar um atraso na execução por um número especificado de segundos?

Isso não faz:

WAITFOR DELAY '00:02';

Qual é o formato correto?

Chade
fonte
O encadeamento parece estar aguardando muito mais que 2 segundos. Percebo que pode demorar mais de 2 segundos para que o encadeamento continue, mas está demorando cerca de 1 minuto quando executado em um banco de dados local que opcionalmente estou usando e não tenho mais nenhuma atividade.
Chad
1
Isso realmente vai esperar exatamente 2 minutos.
Nick Chammas
2
possível duplicata do comando Sleep no T-SQL?
Jesse

Respostas:

365

A documentação paraWAITFOR() não apresenta explicitamente o formato de string necessário.

Isso irá esperar por 2 segundos:

WAITFOR DELAY '00:00:02';

O formato é hh:mi:ss.mmm.

Nick Chammas
fonte
99

Conforme mencionado em outras respostas, todos os itens a seguir funcionarão para a sintaxe padrão baseada em string.

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

Há também um método alternativo de passar um DATETIMEvalor para ele. Você pode pensar que estou confundindo isso WAITFOR TIME, mas também funciona WAITFOR DELAY.

Considerações para aprovação DATETIME:

  • Ele deve ser passado como uma variável, para que não seja mais uma linha única agradável.
  • O atraso é medido como o tempo desde a época ( '1900-01-01').
  • Para situações que exigem uma quantidade variável de atraso, é muito mais fácil manipular a DATETIMEdo que formatar corretamente a VARCHAR.

Como esperar por 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

Uma observação sobre a espera de TIMEvs DELAY:

Você já reparou que, se acidentalmente passar WAITFOR TIMEuma data que já passou, mesmo que por apenas um segundo, ela nunca voltará? Confira:

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

Infelizmente, WAITFOR DELAYfará o mesmo se você passar um DATETIMEvalor negativo (sim, isso é uma coisa).

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

No entanto, eu ainda recomendaria o uso WAITFOR DELAYdurante um período estático, pois você sempre pode confirmar que seu atraso é positivo e permanecerá assim por quanto tempo o seu código levar para chegar à WAITFORdeclaração.

SurroundedByFish
fonte
25

Que tal agora?

WAITFOR DELAY '00:00:02';

Se você tem "00:02", está interpretando isso como Horas: Minutos.

JohnD
fonte
2

Tente este exemplo:

exec DBMS_LOCK.sleep(5);

Este é o script inteiro:

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
fonte