Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SqlDateTime.MinValue !=DateTime.MinValue, mengapa?

Saya pikir perbedaan antara SQL dan .NET Tanggal tipe data berasal dari fakta bahwa datetime . SQL Server tipe data, nilai minimum dan maksimumnya, dan presisinya jauh lebih tua daripada tipe data DateTime .NET.

Dengan munculnya .NET, tim memutuskan bahwa tipe data Datetime harus lebih alami nilai minimum, dan 01/01/0001 tampaknya merupakan pilihan yang cukup logis, dan tentu saja dari bahasa pemrograman , daripada database perspektif, nilai ini lebih alami.

Kebetulan, dengan SQL Server 2008, ada sejumlah tipe data berbasis Tanggal baru (Tanggal, Waktu, DateTime2, DateTimeOffset) yang benar-benar menawarkan peningkatan jangkauan dan presisi, dan secara dekat memetakan ke tipe data DateTime di .NET. Misalnya, tipe data DateTime2 memiliki rentang tanggal dari 0001-01-01 hingga 9999-12-31.

Tipe data "datetime" standar SQL Server selalu memiliki nilai minimum 01/01/1753 (dan memang masih ada!). Harus saya akui, saya juga penasaran dengan pentingnya nilai ini, begitu pula penggaliannya.. Yang saya temukan adalah sebagai berikut:

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 dalam hal hanya satu aturan:aturan untuk memutuskan apa itu 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 400) bukan 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 dalam kedua kalender tersebut.

Ketika Paus Gregorius XIII memperkenalkan kalendernya pada tahun 1582, ia juga memerintahkan agar hari-hari antara 4 Oktober 1582 dan 15 Oktober 1582 harus dilewati—yaitu, ia mengatakan bahwa hari setelah 4 Oktober harus tanggal 15 Oktober. Banyak negara tertunda berubah, meskipun. Inggris dan koloninya tidak beralih dari perhitungan Julian ke Gregorian sampai tahun 1752, jadi bagi mereka, tanggal yang dilewati adalah antara 4 September dan 14 September 1752. Negara-negara lain beralih di waktu lain, tetapi tahun 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 tahun kabisat sebelum saklar dihitung menurut aturan Julian atau Gregorian? Masalah kedua adalah, kapan dan bagaimana menangani hari-hari yang dilewati?

Beginilah cara Delapan Besar DBMS menangani pertanyaan-pertanyaan ini:

  • Berpura-pura tidak ada saklar. Inilah yang tampaknya dibutuhkan oleh Standar SQL, meskipun dokumen standarnya tidak jelas:Itu hanya mengatakan bahwa tanggal "dibatasi oleh aturan alami untuk tanggal menggunakan kalender Gregorian"—apa pun "aturan alami" itu. Ini adalah opsi yang dipilih DB2. Ketika ada anggapan bahwa aturan kalender tunggal selalu diterapkan bahkan pada saat-saat ketika tidak ada orang yang mendengar tentang kalender, istilah teknisnya adalah bahwa kalender "proleptik" berlaku. Jadi, misalnya, kita dapat mengatakan bahwa DB2 mengikuti kalender Gregorian yang proleptik.

  • Hindari masalah sepenuhnya. Microsoft dan Sybase menetapkan nilai tanggal minimum pada 1 Januari 1753, dengan aman melewati waktu Amerika mengganti kalender. Ini dapat dipertahankan, tetapi dari waktu ke waktu keluhan muncul bahwa kedua DBMS ini tidak memiliki fungsionalitas yang berguna seperti yang dimiliki DBMS lain dan yang dibutuhkan oleh Standar SQL.

  • Pilih 1582. Inilah yang dilakukan Oracle. Seorang pengguna Oracle akan menemukan bahwa ekspresi aritmatika tanggal 15 Oktober 1582 dikurangi 4 Oktober 1582 menghasilkan nilai 1 hari (karena 5–14 Oktober tidak ada) dan bahwa tanggal 29 Februari 1300 valid (karena lompatan Julian- aturan tahun berlaku). Mengapa Oracle mengalami kesulitan ekstra ketika SQL Standard tampaknya tidak memerlukannya? Jawabannya adalah bahwa pengguna mungkin memerlukannya. Sejarawan dan astronom menggunakan sistem hibrida ini sebagai ganti kalender Gregorian yang proleptik. (Ini juga merupakan opsi default yang dipilih Sun saat mengimplementasikan kelas GregorianCalendar untuk Java—terlepas dari namanya, GregorianCalendar adalah kalender hybrid.)

Kutipan di atas diambil dari tautan berikut:

Penyesuaian Kinerja SQL:Tanggal dalam SQL



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menemukan Hari Terakhir Bulan Ini di SQL Server

  2. SQL Server 2005 - Ekspor tabel secara terprogram (jalankan file .sql untuk membangunnya kembali)

  3. Spotlight Tuning Pack Basic:Alat Pengoptimalan SQL Gratis Terbaik

  4. Bagaimana saya bisa memasukkan 10 juta catatan dalam waktu sesingkat mungkin?

  5. Cara menggunakan klausa Where dalam Select Statement di SQL Server - Tutorial SQL Server / TSQL Bagian 109