ทำไม 1753 พวกเขามีอะไรกับ 1752 ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่
ทำไม 1753 พวกเขามีอะไรกับ 1752 ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่ยิ่งใหญ่
คำตอบ:
การตัดสินใจที่จะใช้ 1 มกราคม 1753 ( 1753-01-01
) เป็นค่าวันขั้นต่ำสำหรับ datetime ใน SQL Server กลับไปของต้นกำเนิด Sybase
ความสำคัญของวันที่นั้นสามารถนำมาประกอบกับชายคนนี้ได้
Philip Stanhope, 4th Earl of Chesterfield ใครเป็นคนทำปฏิทิน (รูปแบบใหม่) ทำหน้าที่ 1750ผ่านรัฐสภาอังกฤษ กฎหมายฉบับนี้มีไว้สำหรับการนำปฏิทินเกรกอเรียนไปใช้ในสหราชอาณาจักรและอาณานิคมของอังกฤษ
มีบางวันที่ขาดหายไป(ลิงค์เก็บถาวรอินเทอร์เน็ต)ในปฏิทินอังกฤษในปี 1752 ในที่สุดก็ทำการปรับจากปฏิทินจูเลียน 3 กันยายน 2295 ถึง 13 กันยายน 2295 หายไป
Kalen Delaney อธิบายตัวเลือกด้วยวิธีนี้
ดังนั้นด้วย 12 วันที่หายไปคุณจะคำนวณวันที่ได้อย่างไร ตัวอย่างเช่นคุณสามารถคำนวณจำนวนวันระหว่างวันที่ 12 ตุลาคม 1492 ถึงวันที่ 4 กรกฎาคม 1776 ได้อย่างไร คุณรวมผู้ที่หายไป 12 วันหรือไม่? เพื่อหลีกเลี่ยงการแก้ไขปัญหานี้ผู้พัฒนา Sybase SQL Server ดั้งเดิมตัดสินใจไม่อนุญาตให้ใช้วันที่ก่อนปี 1753 คุณสามารถจัดเก็บวันที่ก่อนหน้านี้โดยใช้ฟิลด์ตัวละคร แต่คุณไม่สามารถใช้ฟังก์ชั่น datetime กับวันที่ก่อนหน้านี้ สาขา
ตัวเลือกของ 1,753 ดูเหมือนค่อนข้าง anglocentric แต่เป็นประเทศคาทอลิกหลายแห่งในยุโรปได้ใช้ปฏิทิน 170 ปีก่อนการดำเนินการของอังกฤษ (ล่าช้าเดิมเนื่องจากการต่อต้านจากคริสตจักร ) ในทางกลับกันหลายประเทศไม่ได้ปฏิรูปปฏิทินของพวกเขาจนกว่าจะถึงเวลาต่อมาในปี 1918 ในรัสเซีย อันที่จริงการปฏิวัติเดือนตุลาคมปี 1917 เริ่มขึ้นในวันที่ 7 พฤศจิกายนภายใต้ปฏิทินเกรกอเรียน
ทั้งประเภทข้อมูลdatetime
ใหม่ที่datetime2
กล่าวถึงในคำตอบของโจไม่ได้พยายามอธิบายถึงความแตกต่างในท้องถิ่นเหล่านี้และใช้ปฏิทินเกรกอเรียน
ดังนั้นด้วยช่วงที่มากขึ้นของ datetime2
SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)
ผลตอบแทน
Sep 8 1752 12:00AM
จุดสุดท้ายdatetime2
ของประเภทข้อมูลคือมันใช้ปฏิทินเกรโกเรียนที่เป็นไปได้ที่คาดการณ์ไว้ก่อนหน้านี้ก่อนที่มันจะถูกประดิษฐ์ขึ้นจริงดังนั้นมันจึงถูก จำกัด การใช้ในการจัดการกับวันที่ในอดีต
สิ่งนี้ขัดแย้งกับการใช้งานซอฟต์แวร์อื่น ๆ เช่นคลาสJava Gregorian Calendarซึ่งเป็นค่าเริ่มต้นที่ติดตาม Julian Calendar สำหรับวันที่จนถึง 4 ตุลาคม 1582 จากนั้นข้ามไปที่ 15 ตุลาคม 1582 ในปฏิทิน Gregorian ใหม่ มันจัดการโมเดลปีอธิกสุรทินของจูเลียนได้อย่างถูกต้องก่อนวันที่นั้นและโมเดลเกรโกเรียนหลังจากวันนั้น setGregorianChange()
วันที่ปรับเปลี่ยนระบบอาจมีการเปลี่ยนแปลงโดยการโทรโดยการเรียก
บทความธรรมบันเทิงการอภิปรายลักษณะบางมากขึ้นกับการยอมรับของปฏิทินที่สามารถพบได้ที่นี่
ผู้ยิ่งใหญ่ผู้ยิ่งใหญ่ผู้ยิ่งใหญ่ผู้ยิ่งใหญ่ที่ยอดเยี่ยมของคุณควรอัพเกรดเป็น SQL Server 2008 และใช้ชนิดข้อมูลDateTime2ซึ่งรองรับวันที่ในช่วง: 0001-01-01 ถึง 9999-12-31
ค.ศ. 1752 เป็นปีแห่งบริเตนเปลี่ยนจากปฏิทินจูเลียนเป็นปฏิทินเกรกอเรียน ฉันเชื่อว่าสองสัปดาห์ในเดือนกันยายน ค.ศ. 1752 ไม่เคยเกิดขึ้นซึ่งมีผลต่อวันที่ในพื้นที่ทั่วไปนั้น
คำอธิบาย: http://uneasysilence.com/archive/2007/08/12008/ ( เวอร์ชั่น Internet Archive )
นี่คือเรื่องราวทั้งหมดว่าปัญหาในอดีตเป็นอย่างไรและ Big DBMS จัดการปัญหาเหล่านี้อย่างไร
ในช่วงระหว่างวันที่ 1 AD และวันนี้โลกตะวันตกใช้ปฏิทินหลักสองปฏิทิน: ปฏิทินจูเลียนของจูเลียสซีซาร์และปฏิทินเกรกอเรียนแห่งพระสันตะปาปาเกรกอรีที่สิบสาม ปฏิทินสองปฏิทินแตกต่างกันไปตามกฎเพียงข้อเดียว: กฎสำหรับการตัดสินใจว่าปีอธิกสุรทินคืออะไร ในปฏิทินจูเลียนทุกปีหารด้วยสี่คือปีอธิกสุรทิน ในปฏิทินเกรโกเรียนทุกปีหารด้วยสี่คือปีอธิกสุรทินยกเว้นปีที่หารด้วย 100 (แต่ไม่หารด้วย 400) ไม่ใช่ปีอธิกสุรทิน ดังนั้นปี 1700, 1800 และ 1900 เป็นปีอธิกสุรทินในปฏิทินจูเลียน แต่ไม่ได้อยู่ในปฏิทินคริสต์ศักราชในขณะที่ปี 1600 และ 2000 เป็นปีอธิกสุรทินทั้งในปฏิทิน
เมื่อสมเด็จพระสันตะปาปาเกรกอรีที่สิบสามแนะนำปฏิทินของเขาในปี 1582 เขาก็กำกับว่าวันระหว่าง 4 ตุลาคม 1582 และ 15 ตุลาคม 1582 ควรข้าม - นั่นคือเขากล่าวว่าวันหลังจาก 4 ตุลาคมควร 15 ตุลาคมหลายประเทศ ล่าช้าไปกว่า อังกฤษและอาณานิคมของเธอไม่ได้เปลี่ยนจากจูเลียนเป็นเกรกอเรียนคำนวณจนกระทั่ง 2295 ดังนั้นสำหรับพวกเขาวันที่ข้ามอยู่ระหว่าง 4 กันยายนและ 14 กันยายน 2295 ประเทศอื่น ๆ เปลี่ยนในเวลาอื่น ๆ แต่ 1582 และ 1752 เป็นวันที่ที่เกี่ยวข้องสำหรับ DBMS ที่เรากำลังพูดถึง
ดังนั้นสองปัญหาจึงเกิดขึ้นกับเลขคณิตวันที่เมื่อย้อนกลับไปหลายปี อย่างแรกคือควรเผ่นปีก่อนที่จะคำนวณสวิตช์ตามกฎจูเลียนหรือเกรกอเรียน? ปัญหาที่สองคือควรจัดการกับวันที่ข้ามเวลาอย่างไรและอย่างไร
นี่คือวิธีที่ DBMS ขนาดใหญ่จัดการกับคำถามเหล่านี้:
- แกล้งไม่มีสวิตช์ นี่คือสิ่งที่ SQL Standard ดูเหมือนจะต้องการแม้ว่าเอกสารมาตรฐานจะไม่ชัดเจน: เพียงแค่บอกว่าวันที่ "ถูก จำกัด โดยกฎธรรมชาติสำหรับวันที่โดยใช้ปฏิทินแบบคริสต์ศักราช" - ซึ่งเป็น "กฎธรรมชาติ" นี่เป็นตัวเลือกที่ DB2 เลือก เมื่อมีข้ออ้างว่ากฎของปฏิทินเดียวมีการใช้งานเสมอแม้กระทั่งเมื่อไม่มีใครได้ยินปฏิทินคำศัพท์ทางเทคนิคก็คือปฏิทิน "proleptic" มีผลบังคับใช้ ตัวอย่างเช่นเราอาจพูดได้ว่า DB2 ติดตามปฏิทินเกรโกเรียนที่เป็น proleptic
- หลีกเลี่ยงปัญหาทั้งหมด Microsoft และ Sybase ตั้งค่าวันที่ขั้นต่ำ ณ วันที่ 1 มกราคม ค.ศ. 1753 ผ่านช่วงเวลาที่อเมริกาเปลี่ยนปฏิทินอย่างปลอดภัย สิ่งนี้สามารถป้องกันได้ แต่บางครั้งการร้องเรียนก็แสดงให้เห็นว่า DBMS ทั้งสองนี้ขาดฟังก์ชั่นที่มีประโยชน์ที่ DBMS อื่นมีและที่ SQL Standard ต้องการ
- เลือก 1582 นี่คือสิ่งที่ Oracle ทำ ผู้ใช้ Oracle จะพบว่านิพจน์วันที่ทางคณิตศาสตร์ 15 ตุลาคม 1582 ลบ 4 ตุลาคม 1582 ให้ค่า 1 วัน (เพราะไม่มีวันที่ 5–14 ตุลาคม) และวันที่ 29 กุมภาพันธ์ 1300 นั้นถูกต้อง (เพราะ Julian เผ่น - ใช้กฎปี) ทำไมออราเคิลถึงมีปัญหาเพิ่มขึ้นเมื่อ SQL Standard ไม่ต้องการมัน คำตอบคือผู้ใช้อาจต้องการมัน นักประวัติศาสตร์และนักดาราศาสตร์ใช้ระบบไฮบริดนี้แทนปฏิทินเกรโกเรียนที่สมบูรณ์ (นี่เป็นตัวเลือกเริ่มต้นที่ Sun เลือกเมื่อใช้คลาส GregorianCalendar สำหรับ Java แม้จะมีชื่อ GregorianCalendar เป็นปฏิทินไฮบริด)
อนึ่ง Windows ไม่รู้วิธีแปลง UTC เป็นเวลาท้องถิ่นของสหรัฐอเมริกาอย่างถูกต้องสำหรับวันที่แน่นอนในเดือนมีนาคม / เมษายนหรือตุลาคม / พฤศจิกายนของปีที่ผ่านมา เวลาประทับที่ใช้ UTC จากวันที่เหล่านี้ค่อนข้างไร้สาระ มันจะลำบากมากสำหรับระบบปฏิบัติการที่จะปฏิเสธที่จะจัดการกับการประทับเวลาใด ๆ ก่อนที่จะมีกฎ DST ชุดล่าสุดของรัฐบาลสหรัฐฯดังนั้นมันจึงจัดการบางอย่างที่ผิด SQL Server ปฏิเสธที่จะประมวลผลวันที่ก่อนปี 1753 เนื่องจากต้องใช้ตรรกะพิเศษพิเศษจำนวนมากเพื่อจัดการกับพวกมันอย่างถูกต้องและไม่ต้องการจัดการกับมันผิด