คำตอบและความคิดเห็นเกือบทั้งหมดมีข้อดีและข้อเสียอย่างหนัก นี่คือสรุปของข้อดีและข้อเสียทั้งหมดจนถึงบวกข้อเสียที่สำคัญบางอย่าง (ใน # 2 ด้านล่าง) ฉันเคยเห็นกล่าวถึงเพียงครั้งเดียวหรือไม่เลย
- ข้อดี:
1.1 เป็นไปตามมาตรฐาน ISO เพิ่มเติม (ISO 8601) (แม้ว่าฉันจะไม่รู้ว่าสิ่งนี้เกิดขึ้นได้อย่างไรในทางปฏิบัติ)
1.2 ช่วงเพิ่มเติม (1/1/0001 ถึง 12/31/9999 เทียบกับ 1/1 / 1753-12 / 31/9999) (แม้ว่าช่วงพิเศษช่วงก่อนปี 1753 จะไม่ถูกใช้ยกเว้นอดีต, ในแอพเชิงประวัติศาสตร์ดาราศาสตร์ธรณีวิทยาและอื่น ๆ )
1.3 ตรงกับช่วงของช่วงประเภท. NET DateTime
(แม้ว่าทั้งคู่จะแปลงกลับไปกลับมาโดยไม่มีการเข้ารหัสพิเศษหากค่าอยู่ในช่วงของประเภทเป้าหมายและความแม่นยำยกเว้น Con # 2.1 ด้านล่างจะเกิดข้อผิดพลาด / การปัดเศษอื่น)
1.4 ความแม่นยำมากขึ้น (100 นาโนวินาทีหรือ 0.000,000,1 วินาทีเทียบกับ 3.33 มิลลิวินาทีหรือ 0.003,33 วินาที) (แม้ว่าความแม่นยำพิเศษจะไม่ถูกนำมาใช้ยกเว้นในอดีตในแอปด้านวิศวกรรม / วิทยาศาสตร์)
1.5 เมื่อกำหนดค่าสำหรับคล้ายกัน (ใน 1 มิลลิวินาทีไม่ "เหมือนกัน" (เช่นใน 3.33 มิลลิวินาที) ตามที่ Iman Abidi อ้างว่า) ความแม่นยำเป็นDateTime
ใช้พื้นที่น้อยกว่า (7 กับ 8 ไบต์) แต่แน่นอนคุณจะสูญเสีย ผลประโยชน์ที่แม่นยำซึ่งน่าจะเป็นหนึ่งในสอง (ช่วงอื่น ๆ ที่เป็น) ส่วนใหญ่ touted แม้ว่าจะมีประโยชน์ที่ไม่จำเป็น)
- ข้อเสีย:
2.1 เมื่อผ่านพารามิเตอร์ไป .NET SqlCommand
คุณต้องระบุSystem.Data.SqlDbType.DateTime2
ถ้าคุณอาจจะผ่านค่านอก SQL Server DateTime
ของช่วงและ / System.Data.SqlDbType.DateTime
หรือความแม่นยำเพราะเป็นค่าเริ่มต้น
2.2 ไม่สามารถแปลงโดยปริยาย / ง่าย ๆ ให้เป็นค่าตัวเลขทศนิยม (# ของวันตั้งแต่นาทีวันที่เวลา) เพื่อทำสิ่งต่อไปนี้กับ / ในการแสดงออกของ SQL Server โดยใช้ค่าตัวเลขและตัวดำเนินการ:
2.2.1 เพิ่มหรือลบจำนวนวันหรือบางส่วน หมายเหตุ: การใช้DateAdd
ฟังก์ชั่นเป็นวิธีแก้ปัญหาไม่สำคัญเมื่อคุณต้องการพิจารณาหลาย ๆ อย่างหากไม่ใช่ทุกส่วนของวันที่
2.2.2 นำความแตกต่างระหว่างวันที่และเวลาสองครั้งเพื่อการคำนวณ“ อายุ” หมายเหตุ: คุณไม่สามารถใช้DateDiff
ฟังก์ชั่นของ SQL Server เพียงเพราะมันไม่ได้คำนวณage
เป็นคนส่วนใหญ่คาดหวังว่าถ้าสองวันที่ - เวลาเกิดขึ้นเพื่อข้ามขอบเขตปฏิทิน / นาฬิกาวันที่และเวลาของหน่วยที่ระบุถ้าแม้แต่เศษส่วนเล็ก ๆ ของหน่วยนั้นมันจะคืนความแตกต่างเป็น 1 ของหน่วยนั้นเทียบกับ 0 ตัวอย่างเช่นDateDiff
ในDay
วันที่สองครั้ง - เพียง 1 มิลลิวินาทีเท่านั้นที่แยกจากกันจะคืนค่า 1 เทียบกับ 0 (วัน) ถ้าวันที่เหล่านั้นเป็น ในวันตามปฏิทินต่างๆ (เช่น“ 1999-12-31 23: 59: 59.9999999” และ“ 2000-01-01 00: 00: 00.0000000”) 1 มิลลิวินาทีความแตกต่างวันที่ - เวลาเดียวกันหากย้ายเพื่อไม่ให้ข้ามวันปฏิทินจะคืน“ DateDiff” Day
เป็น 0 (วัน)
2.2.3 ใช้เวลาAvg
วันครั้ง (ในรวม Query) โดยเพียงแค่การแปลงไป“ลอย” DateTime
ครั้งแรกและจากนั้นกลับมาอีกครั้ง
หมายเหตุ: ในการแปลงDateTime2
เป็นตัวเลขคุณต้องทำบางอย่างเช่นสูตรต่อไปนี้ซึ่งยังถือว่าค่าของคุณไม่น้อยกว่าปี 1970 (ซึ่งหมายความว่าคุณสูญเสียช่วงพิเศษทั้งหมดบวกอีก 217 ปีหมายเหตุ: คุณอาจ ไม่สามารถปรับสูตรเพื่อให้มีช่วงพิเศษได้เนื่องจากคุณอาจพบปัญหาการล้นของตัวเลข
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- ที่มา:“ https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html “
แน่นอนว่าคุณสามารถCast
ทำสิ่งDateTime
แรกได้ (และหากจำเป็นต้องกลับไปใช้DateTime2
) แต่คุณจะสูญเสียความแม่นยำและช่วง (ทั้งหมดก่อนปี 1753) ของการDateTime2
เทียบกับDateTime
ซึ่งเป็น 2 ที่ใหญ่ที่สุดและในเวลาเดียวกัน prolly 2 ต้องการโอกาสที่น้อยที่สุดซึ่งทำให้เกิดคำถามว่าทำไมใช้เมื่อคุณสูญเสียการแปลงโดยปริยาย / ง่ายไปเป็นตัวเลขทศนิยม (# ของวัน) สำหรับการบวก / การลบ / "อายุ" (เทียบกับDateDiff
) / Avg
calcs ซึ่งเป็นประโยชน์ จากประสบการณ์ของฉัน
Btw, Avg
วันที่ - เวลาเป็น (หรืออย่างน้อยควรจะเป็น) กรณีการใช้งานที่สำคัญ a) นอกจากใช้ในการรับช่วงเวลาเฉลี่ยเมื่อวันที่ - เวลา (เนื่องจากฐานวันที่ทั่วไปเวลา) ถูกใช้เพื่อแสดงระยะเวลา (การปฏิบัติทั่วไป), b) นอกจากนี้ยังมีประโยชน์ที่จะได้รับสถิติประเภทแดชบอร์ดเกี่ยวกับวันที่เฉลี่ย - เวลาอยู่ในคอลัมน์วันที่ของช่วง / กลุ่มของแถว c) ad-hoc มาตรฐาน (หรืออย่างน้อยควรเป็นมาตรฐาน) เพื่อตรวจสอบ / แก้ไขปัญหาค่าในคอลัมน์ที่อาจไม่ถูกต้องตลอดไป / และอีกต่อไปและ / หรืออาจจำเป็นต้องเลิกใช้คือการแสดงรายการสำหรับแต่ละค่าที่เกิดขึ้น และ (ถ้ามี) Min
, Avg
และMax
ตราประทับวันเวลาที่เกี่ยวข้องกับค่าที่