วิธีหนึ่งทำให้เกิดความล่าช้าในการดำเนินการตามจำนวนวินาทีที่ระบุ?
สิ่งนี้ไม่ได้ทำ:
WAITFOR DELAY '00:02';
รูปแบบที่ถูกต้องคืออะไร?
วิธีหนึ่งทำให้เกิดความล่าช้าในการดำเนินการตามจำนวนวินาทีที่ระบุ?
สิ่งนี้ไม่ได้ทำ:
WAITFOR DELAY '00:02';
รูปแบบที่ถูกต้องคืออะไร?
คำตอบ:
เอกสารสำหรับWAITFOR()
ไม่ได้จัดโครงสร้างรูปแบบสตริงที่ต้องการอย่างชัดเจน
สิ่งนี้จะรอ 2 วินาที:
WAITFOR DELAY '00:00:02';
hh:mi:ss.mmm
รูปแบบคือ
ดังที่กล่าวไว้ในคำตอบอื่น ๆ ทั้งหมดต่อไปนี้จะทำงานให้กับไวยากรณ์ตามสตริงมาตรฐาน
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
หมายเหตุเกี่ยวกับการรอสำหรับTIME
vs DELAY
:
คุณเคยสังเกตไหมว่าถ้าคุณบังเอิญผ่าน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
คำสั่ง
แล้วเรื่องนี้ล่ะ
WAITFOR DELAY '00:00:02';
หากคุณมี "00:02" นั่นแปลว่าเป็นชั่วโมง: นาที
ลองตัวอย่างนี้:
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;