Jawaban:
Keputusan untuk menggunakan 1 Januari 1753 ( 1753-01-01
) sebagai nilai tanggal minimum untuk datetime di SQL Server kembali ke asal Sybase -nya .
Signifikansi tanggal itu sendiri dapat dikaitkan dengan pria ini.
Philip Stanhope, Earl of Chesterfield ke-4. Yang mengarahkan Undang-Undang Kalender (Gaya Baru) 1750 melalui Parlemen Inggris. Ini disahkan untuk adopsi kalender Gregorian untuk Inggris dan koloni-koloni saat itu.
Ada beberapa hari yang hilang (tautan arsip internet) di kalender Inggris pada 1752 ketika penyesuaian akhirnya dibuat dari kalender Julian. 3 September 1752 hingga 13 September 1752 hilang.
Kalen Delaney menjelaskan pilihan ini
Jadi, dengan 12 hari hilang, bagaimana Anda bisa menghitung tanggal? Misalnya, bagaimana Anda dapat menghitung jumlah hari antara 12 Oktober 1492, dan 4 Juli 1776? Apakah Anda termasuk yang hilang 12 hari? Untuk menghindari penyelesaian masalah ini, pengembang Sybase SQL Server asli memutuskan untuk tidak mengizinkan tanggal sebelum 1753. Anda dapat menyimpan tanggal sebelumnya dengan menggunakan bidang karakter, tetapi Anda tidak dapat menggunakan fungsi waktu apa pun dengan tanggal sebelumnya yang Anda simpan dalam karakter bidang.
Pilihan 1753 tampaknya agak anglosentris namun karena banyak negara Katolik di Eropa telah menggunakan kalender selama 170 tahun sebelum pelaksanaan Inggris (awalnya tertunda karena ditentang oleh gereja ). Sebaliknya banyak negara tidak memperbarui kalender mereka sampai kemudian, 1918 di Rusia. Memang Revolusi Oktober 1917 dimulai pada 7 November di bawah kalender Gregorian.
Baik datetime
dan datetime2
tipe data baru yang disebutkan dalam jawaban Joe tidak berusaha menjelaskan perbedaan lokal ini dan cukup menggunakan Kalender Gregorian.
Jadi dengan rentang yang lebih besar datetime2
SELECT CONVERT(VARCHAR, DATEADD(DAY,-5,CAST('1752-09-13' AS DATETIME2)),100)
Kembali
Sep 8 1752 12:00AM
Satu poin terakhir dengan datetime2
tipe data adalah bahwa ia menggunakan kalender Gregorian yang diproyeksikan diproyeksikan mundur jauh sebelum itu sebenarnya diciptakan sehingga penggunaannya terbatas dalam berurusan dengan tanggal bersejarah.
Ini kontras dengan implementasi Perangkat Lunak lain seperti kelas Kalender Java Gregorian yang secara default mengikuti Kalender Julian untuk tanggal hingga 4 Oktober 1582 kemudian melompat ke 15 Oktober 1582 dalam kalender Gregorian baru. Itu benar menangani model Julian tahun kabisat sebelum tanggal itu dan model Gregorian setelah tanggal itu. Tanggal cutover dapat diubah oleh penelepon dengan menelepon setGregorianChange()
.
Artikel yang cukup menghibur membahas beberapa kekhasan dengan adopsi kalender dapat ditemukan di sini .
Kakek buyut buyut buyutnya harus ditingkatkan ke SQL Server 2008 dan menggunakan tipe data DateTime2 , yang mendukung tanggal dalam kisaran: 0001-01-01 hingga 9999-12-31.
1752 adalah tahun Inggris beralih dari Julian ke kalender Gregorian. Saya percaya dua minggu pada bulan September 1752 tidak pernah terjadi sebagai hasilnya, yang berimplikasi pada tanggal di wilayah umum itu.
Penjelasan: http://uneasysilence.com/archive/2007/08/12008/ ( versi Internet Archive )
Ini adalah keseluruhan cerita bagaimana masalah tanggal dan bagaimana DBMS Besar menangani masalah ini.
Selama periode antara 1 M dan hari ini, dunia Barat sebenarnya telah menggunakan dua kalender utama: kalender Julian Julius Caesar dan kalender Gregorian Paus Gregorius XIII. Kedua kalender berbeda sehubungan dengan hanya satu aturan: aturan untuk memutuskan tahun kabisat. Dalam kalender Julian, semua tahun yang habis dibagi empat adalah tahun kabisat. Dalam kalender Gregorian, semua tahun yang habis dibagi empat adalah tahun kabisat, kecuali tahun yang habis dibagi 100 (tetapi tidak habis dibagi oleh 400) bukanlah tahun kabisat. Jadi, tahun 1700, 1800, dan 1900 adalah tahun kabisat dalam kalender Julian tetapi tidak dalam kalender Gregorian, sedangkan tahun 1600 dan 2000 adalah tahun kabisat di kedua kalender.
Ketika Paus Gregorius XIII memperkenalkan kalendernya pada 1582, ia juga memerintahkan bahwa hari-hari antara 4 Oktober 1582, dan 15 Oktober 1582, harus dilewati — yaitu, ia mengatakan bahwa hari setelah 4 Oktober seharusnya 15 Oktober. Banyak negara tertunda berubah, meskipun. Inggris dan koloninya tidak beralih dari Julian ke Gregorian hingga tahun 1752, jadi bagi mereka, tanggal yang dilewati adalah antara 4 September dan 14 September 1752. Negara-negara lain berganti pada waktu lain, tetapi 1582 dan 1752 adalah tanggal yang relevan untuk DBMS yang sedang kita diskusikan.
Jadi, dua masalah muncul dengan aritmatika tanggal ketika seseorang kembali bertahun-tahun. Yang pertama adalah, haruskah lompatan tahun sebelum saklar dihitung sesuai dengan aturan Julian atau Gregorian? Masalah kedua adalah, kapan dan bagaimana hari-hari yang dilewati harus ditangani?
Inilah cara DBMS Besar menangani pertanyaan-pertanyaan ini:
- Berpura-pura tidak ada saklar. Inilah yang tampaknya diminta oleh Standar SQL, meskipun dokumen standar tidak jelas: Dokumen tersebut hanya mengatakan bahwa tanggal "dibatasi oleh aturan alami untuk tanggal menggunakan kalender Gregorian" —apapun "aturan alami" itu. Ini adalah opsi yang dipilih DB2. Ketika ada kepura-puraan bahwa aturan-aturan kalender tunggal selalu berlaku bahkan pada saat-saat ketika tidak ada orang yang mendengar tentang kalender tersebut, istilah teknisnya adalah bahwa kalender "subur" berlaku. Jadi, misalnya, kita dapat mengatakan bahwa DB2 mengikuti kalender Gregorian yang subur.
- Hindari masalah sepenuhnya. Microsoft dan Sybase menetapkan nilai tanggal minimumnya pada 1 Januari 1753, dengan aman setelah waktu Amerika mengganti kalender. Ini dapat dipertahankan, tetapi dari waktu ke waktu keluhan muncul bahwa kedua DBMS ini tidak memiliki fungsionalitas berguna yang dimiliki oleh DBMS lainnya dan yang diminta oleh Standar SQL.
- Pilih 1582. Inilah yang dilakukan Oracle. Pengguna Oracle akan menemukan bahwa ekspresi tanggal-aritmatika 15 Oktober 1582 minus 4 Oktober 1582 menghasilkan nilai 1 hari (karena 5-14 Oktober tidak ada) dan bahwa tanggal 29 Februari 1300 valid (karena Julian melompat). aturan tahun berlaku). Mengapa Oracle mengalami masalah ekstra ketika SQL Standard tampaknya tidak memerlukannya? Jawabannya adalah bahwa pengguna mungkin memerlukannya. Sejarawan dan astronom menggunakan sistem hibrida ini alih-alih kalender Gregorian yang subur. (Ini juga opsi default yang dipilih Sun ketika mengimplementasikan kelas GregorianCalendar untuk Java — terlepas dari namanya, GregorianCalendar adalah kalender hibrid.)
Secara kebetulan, Windows tidak lagi tahu cara mengkonversi UTC ke waktu lokal AS dengan benar untuk tanggal tertentu di bulan Maret / April atau Oktober / November tahun-tahun sebelumnya. Stempel waktu berbasis UTC dari tanggal-tanggal tersebut sekarang agak tidak masuk akal. Akan sangat menjengkelkan bagi OS untuk menolak menangani stempel waktu sebelum peraturan DST terbaru dari pemerintah AS, jadi itu hanya salah menangani sebagian dari mereka. SQL Server menolak untuk memproses tanggal sebelum 1753 karena banyak logika khusus ekstra diperlukan untuk menanganinya dengan benar dan tidak ingin menanganinya salah.