Apa pentingnya 1/1/1753 di SQL Server?

Jawaban:

831

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

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 datetimedan datetime2tipe 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 datetime2tipe 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 .

Martin Smith
sumber
68
+1 untuk potret hebat great-great-great-great-great-kakek-kakek. Atribut lain yang bersinar dari jawaban ini.
Smandoli
83
Memberi +1 untuk jawaban yang teknis dan historis. Di papan yang sering dikunjungi oleh otak kiri yang berat, ini adalah bacaan yang menyenangkan. Dan ya, saya memang kuliah di perguruan tinggi seni liberal.
Matt Hamsmith
1
Mengenai tautan ini : bayangkan seseorang yang lahir di Swedia pada 30 Februari 1712 - mereka tidak akan pernah menua! : P Juga, apa yang dilakukan Lithuania dan Latvia selama itu !?
Isaac Reefman
Tautan " hari yang hilang " rusak.
Venkat
1
@Venkat - diperbaiki sekarang dengan tautan arsip internet
Martin Smith
99

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.

Joe Stefanelli
sumber
40
@CRMay: Katakan padanya Anda berencana untuk mulai bekerja pada kepatuhan Y10K pada hari Kamis, 5000-01-02; yang membuat Anda hanya di bawah 5 milenium untuk memperbaikinya.
Jonathan Leffler
8
mm saya menduga seseorang melewatkan jawaban untuk pertanyaan aktual: mengapa 1753 , dari semua tahun?
sehe
7
... dan pertanyaannya adalah
V4Vendetta
1
Yess .... tetapi cobalah untuk mendapatkan perubahan tipe data melalui di perusahaan yang memiliki basis database SQL Server yang besar, dan lebih banyak garis pertahanan terhadap musuh yang ditakuti. PERUBAHAN daripada AS terhadap ICBM Rusia pada puncak Perang Dingin ...
SebTHU
1
Saya pikir ini adalah jawaban yang lebih baik, lebih ringkas dan memberi tahu solusi daripada sejarah, maukah Anda menggunakan riwayat atau tipe data
abdul qayyum
19

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.)

Sumber 1 dan 2

Somnath Muluk
sumber
8

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.

supercat
sumber