GETUTCDATE () - 2 เทียบกับ DATEADD (d, -2, GETUTCDATE ())


13

ฉันสงสัยว่าความแตกต่างระหว่างสองวิธีต่อไปนี้คืออะไร:

 GETUTCDATE()-2  

และ

  DATEADD(d,-2,GETUTCDATE())

ฉันเดาใช้DATEADDเป็นวิธีที่ถูกต้อง แต่สงสัยว่าทำไม

คำตอบ:


14

ไม่มีความแตกต่างที่แท้จริง แต่เมื่อคุณเริ่มใช้DATETIME2ค่าหรือฟังก์ชั่นที่คืนDATETIME2ค่าคุณจะได้รับข้อผิดพลาด

SELECT SYSDATETIME() - 1 AS [Incompatible]

ข่าวสารเกี่ยวกับ 206, ระดับ 16, สถานะ 2, บรรทัดที่ 17 ตัวดำเนินการชนิดปะทะ: datetime2 ไม่เข้ากันกับ int

สำหรับสิ่งเหล่านี้คุณต้องใช้ฟังก์ชันคณิตศาสตร์วันที่

SELECT DATEADD(DAY, -1, SYSDATETIME()) AS [Compatible]

Aaron Bertrand พูดเกี่ยวกับปัญหานี้สั้น ๆ ในBad Habits to Kick series ของเขา


8

ตรงกันข้ามกับการอ้างสิทธิ์ในหนึ่งในคำตอบอื่นตัวเลือกทั้งสองได้รับการสนับสนุนอย่างเป็นทางการและจัดทำโดย SQL Server: datetime - numberมันไม่ได้เป็นพฤติกรรมที่ไม่ได้กำหนด

ประโยชน์ใหญ่ของ

DATEADD(d, -2, GETUTCDATE())

คือข้อเท็จจริงที่ว่ามันคือการจัดทำเอกสารด้วยตนเอง : มันมีจุดประสงค์ที่ชัดเจนทันที

GETUTCDATE() - 2ในทางกลับกันอาศัยผู้อ่านที่รู้ถึงความหมายของการdatetime - numberดำเนินการ ใช่ปัจจุบันอาจเป็นสำนวน T-SQL แต่ความจริงที่ว่านี้ไม่ได้รับการสนับสนุนอีกต่อไปโดยdatetime2นัยว่าผู้พัฒนา SQL Server รุ่นต่อไปในอนาคตอาจไม่คุ้นเคยอีกต่อไป


ก็ระบุไว้อย่างชัดเจนมากขึ้นที่นี่: เลขคณิตผู้ประกอบการ (Transact SQL) " บวก (+) และลบ (-) ผู้ประกอบการยังสามารถใช้ในการดำเนินการทางคณิตศาสตร์ในdatetimeและsmalldatetimeค่า. "
ypercubeᵀᴹ

@ ypercubeᵀᴹ: บรรทัดแรกของ- (ลบ) (Transact-SQL)ยิ่งชัดเจนมากขึ้นหน่วย (วัน): "ลบตัวเลขสองตัว (ตัวดำเนินการลบเลขคณิต) นอกจากนี้ยังสามารถลบจำนวนในหน่วยวันจากวันที่ . "
Heinzi

ใช่ฉันเห็นแล้ว และจากนั้นในภายหลังว่า "ไม่สามารถใช้กับชนิดข้อมูลวันที่เวลา datetime2 หรือ datetimeoffset" ดังนั้น "วันที่" ในประโยคแรกหมายถึงวันที่ / เวลาประเภทใด ๆ ยกเว้นว่าเป็นสิ่งต้องห้าม (ดังนั้นเฉพาะวันที่และเวลาและวันเล็กเท่านั้นโดยทั่วไปประเภทวันที่และเวลาที่มีอยู่ก่อนรุ่น 2008 (?) ที่dateเพิ่มเข้ามา) มันค่อนข้างยุ่ง
ypercubeᵀᴹ

อาจเป็นอีกสิ่งหนึ่งที่คุณสามารถเพิ่มในคำตอบ ความจริงที่ว่าโอเปอเรเตอร์นี้ไม่รองรับประเภทใหม่แสดงว่ามันถูกเก็บรักษาไว้เพื่อเหตุผลด้านความเข้ากันได้แบบย้อนหลังเท่านั้น
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.