ความสำคัญของ 1/1/1753 ใน SQL Server คืออะไร


คำตอบ:


831

การตัดสินใจที่จะใช้ 1 มกราคม 1753 ( 1753-01-01) เป็นค่าวันขั้นต่ำสำหรับ datetime ใน SQL Server กลับไปของต้นกำเนิด Sybase

ความสำคัญของวันที่นั้นสามารถนำมาประกอบกับชายคนนี้ได้

Philip Stanhope, 4 เอิร์ลแห่งเชสเตอร์ฟิลด์

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()วันที่ปรับเปลี่ยนระบบอาจมีการเปลี่ยนแปลงโดยการโทรโดยการเรียก

บทความธรรมบันเทิงการอภิปรายลักษณะบางมากขึ้นกับการยอมรับของปฏิทินที่สามารถพบได้ที่นี่


68
+1 สำหรับภาพบุคคลที่ยอดเยี่ยมของผู้ไม่ยิ่งใหญ่และยิ่งใหญ่ คุณลักษณะอื่น ๆ ที่ส่องแสงของคำตอบนี้
Smandoli

83
+1 สำหรับคำตอบที่เป็นทั้งเชิงเทคนิคและเชิงประวัติศาสตร์ บนกระดานที่มีผู้ถนัดซ้ายเหลือเฟืออ่านอย่างสนุกสนาน และใช่ฉันไปที่วิทยาลัยศิลปศาสตร์
Matt Hamsmith

1
เกี่ยวกับลิงค์นี้ : ลองนึกภาพคนที่เกิดในสวีเดนในวันที่ 30 กุมภาพันธ์ 1712 - พวกเขาไม่เคยแก่! : P ลิธัวเนียและลัตเวียทำอะไรในโลกนี้ตลอดเวลา!?
Isaac Reefman

ลิงก์ " วันที่หายไป " ใช้งานไม่ได้
Venkat

1
@Venkat - แก้ไขแล้วด้วยลิงค์เก็บถาวรทางอินเทอร์เน็ต
Martin Smith

99

ผู้ยิ่งใหญ่ผู้ยิ่งใหญ่ผู้ยิ่งใหญ่ผู้ยิ่งใหญ่ที่ยอดเยี่ยมของคุณควรอัพเกรดเป็น SQL Server 2008 และใช้ชนิดข้อมูลDateTime2ซึ่งรองรับวันที่ในช่วง: 0001-01-01 ถึง 9999-12-31


40
@CRMay: บอกเขาว่าคุณวางแผนที่จะเริ่มการปฏิบัติตามข้อกำหนด Y10K ในวันพฤหัสบดีที่ 5000-01-02; ที่เหลือคุณแค่ไม่ถึง 5 พันปีที่จะแก้ไข
Jonathan Leffler

8
มมฉันคาดเดาว่าใครบางคนพลาดคำตอบสำหรับคำถามจริง: ทำไมปี 1753ของทุกปี?
sehe

7
... และคำถามคือ
V4Vendetta

1
Yess .... แต่ลองรับการเปลี่ยนแปลงของข้อมูลแบบนั้นใน บริษัท ที่มีฐานข้อมูล SQL Server ขนาดใหญ่ติดตั้งไว้มากมายและมีแนวป้องกันเพิ่มเติมจากการเปลี่ยนศัตรูที่น่ากลัวกว่าสหรัฐฯเมื่อเทียบกับ ICBM ของรัสเซียที่ระดับความสูงของ สงครามเย็น ...
SebTHU

1
ฉันคิดว่ามันเป็นคำตอบที่ดีเป็นที่กระชับและบอกวิธีการแก้ปัญหาแทนของประวัติศาสตร์ที่คุณจะใช้แบบสอบถามประวัติหรือชนิดข้อมูล
อับดุล Qayyum

26

ค.ศ. 1752 เป็นปีแห่งบริเตนเปลี่ยนจากปฏิทินจูเลียนเป็นปฏิทินเกรกอเรียน ฉันเชื่อว่าสองสัปดาห์ในเดือนกันยายน ค.ศ. 1752 ไม่เคยเกิดขึ้นซึ่งมีผลต่อวันที่ในพื้นที่ทั่วไปนั้น

คำอธิบาย: http://uneasysilence.com/archive/2007/08/12008/ ( เวอร์ชั่น Internet Archive )


19

นี่คือเรื่องราวทั้งหมดว่าปัญหาในอดีตเป็นอย่างไรและ 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 เป็นปฏิทินไฮบริด)

ที่มา1และ2


8

อนึ่ง Windows ไม่รู้วิธีแปลง UTC เป็นเวลาท้องถิ่นของสหรัฐอเมริกาอย่างถูกต้องสำหรับวันที่แน่นอนในเดือนมีนาคม / เมษายนหรือตุลาคม / พฤศจิกายนของปีที่ผ่านมา เวลาประทับที่ใช้ UTC จากวันที่เหล่านี้ค่อนข้างไร้สาระ มันจะลำบากมากสำหรับระบบปฏิบัติการที่จะปฏิเสธที่จะจัดการกับการประทับเวลาใด ๆ ก่อนที่จะมีกฎ DST ชุดล่าสุดของรัฐบาลสหรัฐฯดังนั้นมันจึงจัดการบางอย่างที่ผิด SQL Server ปฏิเสธที่จะประมวลผลวันที่ก่อนปี 1753 เนื่องจากต้องใช้ตรรกะพิเศษพิเศษจำนวนมากเพื่อจัดการกับพวกมันอย่างถูกต้องและไม่ต้องการจัดการกับมันผิด

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