Comment attendre 2 secondes?

187

Comment peut-on retarder l'exécution d'un nombre de secondes spécifié?

Cela ne le fait pas:

WAITFOR DELAY '00:02';

Quel est le format correct?

Tchad
la source
Le fil semble attendre bien plus de 2 secondes. Je me rends compte que cela peut prendre plus de 2 secondes pour que le fil continue, mais cela prend environ 1 min lorsque je suis exécuté sur une base de données locale que j'utilise ouvertement et que je n'ai aucune autre activité en cours.
Tchad du
1
Cela attendra exactement 2 minutes.
Nick Chammas
2
duplication possible de Sleep Command dans T-SQL?
Jesse

Réponses:

365

La documentation deWAITFOR() ne présente pas explicitement le format de chaîne requis.

Cela attendra 2 secondes:

WAITFOR DELAY '00:00:02';

Le format est hh:mi:ss.mmm.

Nick Chammas
la source
99

Comme mentionné dans d'autres réponses, tous les éléments suivants fonctionneront pour la syntaxe standard basée sur des chaînes.

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

Il existe également une méthode alternative pour lui transmettre une DATETIMEvaleur. Vous pensez peut-être que je confond cela avec WAITFOR TIME, mais cela fonctionne aussi pour WAITFOR DELAY.

Considérations pour réussir DATETIME:

  • Il doit être passé en tant que variable, donc ce n'est plus un bon one-liner.
  • Le délai est mesuré comme le temps écoulé depuis l'époque ( '1900-01-01').
  • Pour les situations qui nécessitent un délai variable, il est beaucoup plus facile de manipuler a DATETIMEque de formater correctement a VARCHAR.

Comment attendre 2 secondes:

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

Une note sur l'attente de TIMEvs DELAY:

Avez-vous déjà remarqué que si vous dépassez accidentellement WAITFOR TIMEune date déjà passée, ne serait-ce que d'une seconde, elle ne reviendra jamais? Vérifiez-le:

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

Malheureusement, WAITFOR DELAYfera la même chose si vous lui passez une DATETIMEvaleur négative (oui, c'est une chose).

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

Cependant, je recommanderais toujours d'utiliser WAITFOR DELAYsur un temps statique car vous pouvez toujours confirmer que votre retard est positif et qu'il le restera aussi longtemps qu'il faudra à votre code pour atteindre l' WAITFORinstruction.

EntouréByFish
la source
25

Que dis-tu de ça?

WAITFOR DELAY '00:00:02';

Si vous avez "00:02", vous l'interprétez comme Heures: Minutes.

JohnD
la source
2

Essayez cet exemple:

exec DBMS_LOCK.sleep(5);

Voici tout le script:

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