Jakie jest znaczenie 1/1/1753 w SQL Server?

Dlaczego 1753? Co mają przeciwko 1752? Mój pra pra pra pra pra pra pra pradziadek byłby bardzo obrażony.

Author: gotqn, 2010-07-22

5 answers

Decyzja o użyciu 1st January 1753 (1753-01-01) jako minimalnej wartości daty dla datetime w SQL Server wraca do jejSybase origins .

Znaczenie samej daty można jednak przypisać temu człowiekowi.

Philip Stanhope

Philip Stanhope, 4. Hrabia Chesterfield Kto sterował kalendarzem (Nowy Styl) Act 1750 {[10] } przez brytyjski parlament. W ten sposób uchwalono Kalendarz gregoriański dla Wielkiej Brytanii i jej ówczesnych Kolonii. W kalendarzu brytyjskim w 1752 roku, kiedy ostatecznie wprowadzono korektę z kalendarza juliańskiego, brakowało dni. Od 3 września 1752 do 13 września 1752 stracono.

Kalen Delaney wyjaśnił wybór w ten sposób

Więc, z 12 dni straconych, jak można obliczyć daty? Na przykład, jak można obliczasz liczbę dni pomiędzy 12 października 1492, a 4 lipca 1776? Do wliczasz te zaginione 12 dni? Na unikaj posiadania aby rozwiązać ten problem, oryginalny Sybase SQL Server deweloperzy postanowili nie dopuszczać dat przed 1753. Możesz przechowywać wcześniej daty za pomocą pól znakowych, ale nie możesz używać żadnych funkcji datetime z wcześniejszymi datami, które przechowujesz w polach znaków.

Wybór roku 1753 wydaje się jednak nieco anglocentryczny, ponieważ wiele krajów katolickich w Europie używało kalendarza przez 170 lat przed wprowadzeniem przez Brytyjczyków (pierwotnie opóźnione ze względu na sprzeciw ze strony Kościoła ). Natomiast wiele krajów nie zreformowało swoich kalendarzy dopiero znacznie później, w 1918 roku w Rosji. Rewolucja październikowa 1917 roku rozpoczęła się 7 listopada według kalendarza gregoriańskiego.

Zarówno datetime, jak i nowy typ danych datetime2 wymieniony w Joe ' s answer nie próbują uwzględniać tych lokalnych różnic i po prostu używają kalendarza gregoriańskiego.

Więc z większym zakresem datetime2

SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)

Zwraca

Sep  8 1752 12:00AM

Ostatni punkt z datetime2 typ danych jest to, że używa proleptyczny Kalendarz gregoriański rzutowany wstecz na długo zanim został faktycznie wymyślony, więc ma ograniczone zastosowanie w radzeniu sobie z datami historycznymi.

To kontrastuje z innymi implementacjami oprogramowania, takimi jak Klasa JavaKalendarz gregoriański , która domyślnie przestrzega kalendarza juliańskiego dla DAT do 4 października 1582, a następnie przeskakuje do 15 października 1582 w nowym kalendarzu gregoriańskim. Poprawnie obsługuje model juliański roku przestępnego przed tą datą i model gregoriański po tej dacie. Data odcięcia może być zmieniona przez wywołującego przez wywołanie setGregorianChange().

Dość zabawny artykuł omawiający kilka osobliwości związanych z przyjęciem kalendarza można znaleźć tutaj .

 753
Author: Martin Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:48

Twój прапрапрапрапрапрадедушка musi przejść na SQL Server 2008 i użyć typu danych DateTime2, który obsługuje daty w zakresie od 0001-01-01 do 9999-12-31.

 87
Author: Joe Stefanelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-22 15:36:28

Rok 1752 był rokiem przejścia Wielkiej Brytanii z kalendarza juliańskiego na gregoriański. Wydaje mi się, że dwa tygodnie we wrześniu 1752 roku nigdy się nie wydarzyły, co ma wpływ na daty w tym ogólnym obszarze.

Wyjaśnienie: http://uneasysilence.com/archive/2007/08/12008/ ( Internet Archive version )

 25
Author: Gian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-26 18:42:12

To cała historia, jak problem z datą i jak duży DBMSs poradził sobie z tymi problemami.

W okresie od 1 n. e. do dziś świat zachodni ma właściwie używane dwa główne kalendarze: Kalendarz juliański Juliusza Cezara i kalendarza gregoriańskiego papieża Grzegorza XIII. dwa kalendarze różnią się w odniesieniu do tylko jednej zasady: zasady decydowania o tym, co rok przestępny. W kalendarzu juliańskim wszystkie lata podzielne przez cztery to lata przestępne. W gregoriańskim kalendarza, wszystkie lata podzielne przez cztery są lat przestępnych, z tym że lata podzielne przez 100 (ale nie podzielne przez 400) nie są latami przestępnymi. Tak więc lata 1700, 1800 i 1900 to skok lat w kalendarzu juliańskim, ale nie w kalendarzu gregoriańskim, podczas gdy lata 1600 i 2000 to lata przestępne w obu kalendarzach.

Kiedy papież Grzegorz XIII wprowadził swój kalendarz w 1582 roku, również w dniach od 4 października 1582 do 15 października 1582, należy pominąć-czyli, powiedział, że dzień po 4 października powinien być 15 października. Jednak wiele krajów opóźniło zmianę. Anglia a jej kolonie nie zamieniły się z juliańskiego na gregoriańskie do 1752 roku, więc dla nich pominięte daty przypadały na 4 września i 14 września 1752. Inne kraje zamieniły się w innym czasie, ale 1582 i 1752 to odpowiednie daty Dla DBMSs, że jesteśmy dyskusja.

Tak więc, dwa problemy z arytmetyką daty, gdy jeden wraca wiele lat. Pierwszym jest, czy lata przestępne przed zmianą należy obliczyć według reguł Juliańskich czy gregoriańskich? Drugi problem to, kiedy i jak należy postępować z pominiętymi dniami?

Tak wielki DBMSs radzi sobie z tymi pytaniami:

  • udawaj, że nie ma przełącznika. Tak wygląda Standard SQL wymagać, chociaż standardowy dokument jest niejasny: po prostu mówi, że daty są " ograniczone naturalnymi regułami dla dat przy użyciu Gregorian kalendarz" - niezależnie od "naturalnych zasad". To jest opcja ten DB2 wybrał. Gdy istnieje pozór, że pojedynczy kalendarz jest zasady zawsze obowiązywały nawet w czasach, gdy nikt nie słyszał o kalendarza, termin techniczny jest taki, że kalendarz "proleptyczny" jest w Siła. Tak więc, na przykład, możemy powiedzieć, że DB2 podąża za proleptykiem Kalendarz gregoriański.
  • unikaj problemu całkowicie. Microsoft i Sybase ustawić ich minimalne wartości daty na 1 stycznia 1753 roku, bezpiecznie po czasie że Ameryka zamieniła kalendarze. Jest to możliwe do obrony, ale od czasu do reklamacje czasu, że te dwa DBMSs brakuje użytecznego funkcjonalności, które mają inne DBMSs i że Standard SQL wymaga.
  • Wybierz 1582. To właśnie zrobiła Wyrocznia. Użytkownik Oracle mógłby find that the date-wyrażenie arytmetyczne October 15 1582 minus October 4 1582 daje wartość 1 dnia (bo 5-14 października nie istnieje) i że data 29 lutego 1300 jest ważna (ponieważ juliański rok przestępny obowiązuje zasada). Dlaczego Oracle miał dodatkowe problemy, gdy SQL Standard tego nie wymaga? Odpowiedź jest taka, że użytkownicy mogą wymagaj tego. Historycy i astronomowie używają tego hybrydowego systemu zamiast według proleptycznego kalendarza gregoriańskiego. (Jest to również opcja domyślna że Słońce wybrało podczas realizacji klasy GregorianCalendar dla Java - wbrew nazwie, GregorianCalendar jest kalendarzem hybrydowym.)

Źródło 1 oraz 2

 14
Author: Somnath Muluk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:47

Nawiasem mówiąc, System Windows nie wie już, jak poprawnie przekonwertować czas UTC na czas lokalny USA dla pewnych dat w marcu/kwietniu lub październiku/listopadzie minionych lat. Znaczniki czasu UTC z tych dat są teraz nieco bezsensowne. Byłoby bardzo nieprzyjemne dla systemu operacyjnego, aby po prostu odmówić obsługi znaczników czasu przed najnowszym zestawem reguł DST rządu USA, więc po prostu obsługuje niektóre z nich źle. SQL Server odmawia przetwarzania dat przed 1753, ponieważ wiele dodatkowych logiki specjalnej byłoby wymagane, aby obsługiwać je poprawnie i nie chce obsługiwać ich źle.

 7
Author: supercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-22 15:42:22