Beslutet att använda 1 januari 1753 (1753-01-01
) eftersom det lägsta datumvärdet för en datetime i SQL Server går tillbaka till dess Sybase-ursprung.
Betydelsen av själva datumet kan dock tillskrivas den här mannen.
Philip Stanhope, 4:e earlen av Chesterfield. Som styrde Calendar (New Style) Act 1750 genom det brittiska parlamentet. Detta lagstiftade för antagandet av den gregorianska kalendern för Storbritannien och dess dåvarande kolonier.
Det saknades några dagar (internetarkivlänk) i den brittiska kalendern 1752 när justeringen slutligen gjordes från den julianska kalendern. 3 september 1752 till 13 september 1752 gick förlorade.
Kalen Delaney förklarade valet så här
Så, med 12 dagar förlorade, hur kan du beräkna datum? Hur kan du till exempel beräkna antalet dagar mellan 12 oktober 1492 och 4 juli 1776? Inkluderar du de som saknar 12 dagar? För att undvika att behöva lösa det här problemet beslutade de ursprungliga Sybase SQL Server-utvecklarna att inte tillåta datum före 1753. Du kan lagra tidigare datum genom att använda teckenfält, men du kan inte använda några datumtidsfunktioner med de tidigare datumen som du lagrar i teckenfält.
Valet av 1753 verkar dock något anglocentriskt eftersom många katolska länder i Europa hade använt kalendern i 170 år innan den brittiska implementeringen (ursprungligen försenad på grund av motstånd från kyrkan). Omvänt reformerade många länder inte sina kalendrar förrän långt senare, 1918 i Ryssland. Oktoberrevolutionen 1917 började faktiskt den 7 november enligt den gregorianska kalendern.
Båda datetime
och den nya datetime2
datatypen som nämns i Joes svar försöker inte ta hänsyn till dessa lokala skillnader utan använder helt enkelt den gregorianska kalendern.
Så med det större intervallet datetime2
SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)
Retur
Sep 8 1752 12:00AM
En sista punkt med datetime2
datatypen är att den använder den proleptiska gregorianska kalendern som projiceras bakåt till långt innan den faktiskt uppfanns, så den är av begränsad användning när det gäller historiska datum.
Detta står i kontrast till andra programvaruimplementeringar som Java Gregorian Calendar-klassen som som standard följer den julianska kalendern för datum fram till 4 oktober 1582 och sedan hoppar till 15 oktober 1582 i den nya gregorianska kalendern. Den hanterar korrekt den julianska modellen av skottår före detta datum och den gregorianska modellen efter detta datum. Uppringningsdatumet kan ändras av den som ringer genom att anropa setGregorianChange()
.
En ganska underhållande artikel som diskuterar några fler särdrag med antagandet av kalendern finns här.