จะรอ 2 วินาทีได้อย่างไร


187

วิธีหนึ่งทำให้เกิดความล่าช้าในการดำเนินการตามจำนวนวินาทีที่ระบุ?

สิ่งนี้ไม่ได้ทำ:

WAITFOR DELAY '00:02';

รูปแบบที่ถูกต้องคืออะไร?


เธรดดูเหมือนจะรอนานกว่า 2 วินาที ฉันรู้ว่าอาจใช้เวลานานกว่า 2 วินาทีเพื่อให้เธรดดำเนินการต่อ แต่ใช้เวลาประมาณ 1 นาทีเมื่อรันบนโลคัลฐานข้อมูลที่ฉันใช้อยู่และไม่มีกิจกรรมอื่นเกิดขึ้น
ชาด

1
ซึ่งจะรอ 2 นาทีจริง ๆ
Nick Chammas

2
เป็นไปได้ซ้ำของSleep Command ใน T-SQL หรือไม่
เจสซี่

คำตอบ:



99

ดังที่กล่าวไว้ในคำตอบอื่น ๆ ทั้งหมดต่อไปนี้จะทำงานให้กับไวยากรณ์ตามสตริงมาตรฐาน

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')
  • สำหรับสถานการณ์ที่ต้องมีจำนวนตัวแปรของความล่าช้ามันเป็นเรื่องง่ายมากที่จะจัดการกับกว่าที่จะต้องเป็นรูปแบบที่DATETIMEVARCHAR

วิธีรอ 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

หมายเหตุเกี่ยวกับการรอสำหรับTIMEvs 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คำสั่ง


25

แล้วเรื่องนี้ล่ะ

WAITFOR DELAY '00:00:02';

หากคุณมี "00:02" นั่นแปลว่าเป็นชั่วโมง: นาที


2

ลองตัวอย่างนี้:

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.