Decyzja o użyciu 1 stycznia 1753 (1753-01-01
) jako minimalna wartość daty dla daty i godziny w SQL Server wraca do swoich początków Sybase.
Jednak znaczenie samej daty można przypisać temu człowiekowi.
Philip Stanhope, 4. hrabia Chesterfield. Kto kierował ustawą o kalendarzu (w nowym stylu) z 1750 r. za pośrednictwem brytyjskiego parlamentu. Ustanowiło to przyjęcie kalendarza gregoriańskiego dla Wielkiej Brytanii i jej ówczesnych kolonii.
Brakowało kilku dni (link do archiwum internetowego) w kalendarzu brytyjskim w 1752 roku, kiedy ostatecznie dokonano korekty z kalendarza juliańskiego. 3 września 1752 do 13 września 1752 zostały utracone.
Kalen Delaney wyjaśnił ten wybór w ten sposób
Tak więc, mając 12 dni straconych, jak możesz obliczyć daty? Na przykład, jak obliczyć liczbę dni między 12 października 1492 a 4 lipca 1776? Czy uwzględniasz te brakujące 12 dni? Aby uniknąć konieczności rozwiązania tego problemu, oryginalni programiści Sybase SQL Server postanowili nie zezwalać na daty sprzed 1753 roku. Wcześniejsze daty można przechowywać za pomocą pól znakowych, ale nie można używać żadnych funkcji daty/godziny z wcześniejszymi datami przechowywanymi w polach znakowych.
Wybór roku 1753 wydaje się jednak nieco anglocentryczny, jednak wiele krajów katolickich w Europie używało kalendarza przez 170 lat przed wprowadzeniem go w życie w Wielkiej Brytanii (pierwotnie opóźnionym z powodu sprzeciwu Kościoła). Odwrotnie, wiele krajów zreformowało swoje kalendarze dopiero znacznie później, w 1918 roku w Rosji. Rzeczywiście, Rewolucja Październikowa 1917 roku rozpoczęła się 7 listopada według kalendarza gregoriańskiego.
Oba datetime
i nowy datetime2
typ danych wymieniony w odpowiedzi Joe nie próbuje uwzględniać tych lokalnych różnic i po prostu używa kalendarza gregoriańskiego.
Więc z większym zakresem datetime2
SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)
Zwroty
Sep 8 1752 12:00AM
Ostatni punkt z datetime2
typ danych polega na tym, że korzysta z proleptycznego kalendarza gregoriańskiego, który jest rzutowany wstecz na długo przed jego wynalezieniem, więc ma ograniczone zastosowanie w przypadku dat historycznych.
Kontrastuje to z innymi implementacjami oprogramowania, takimi jak klasa Java Gregorian Calendar, która domyślnie podąża za kalendarzem juliańskim dla dat do 4 października 1582, a następnie przeskakuje do 15 października 1582 w nowym kalendarzu gregoriańskim. Prawidłowo obsługuje model juliański dotyczący roku przestępnego przed tą datą i model gregoriański po tej dacie. Data odcięcia może zostać zmieniona przez dzwoniącego, wywołując setGregorianChange()
.
Dość zabawny artykuł omawiający niektóre osobliwości związane z przyjęciem kalendarza można znaleźć tutaj.