SORU
30 NİSAN 2009, PERŞEMBE


SqlDateTime.MinValue=! DateTime.MinValue, neden?

Neden SqlDateTime merak ediyorum.MinValue DateTime olarak aynı değildir.MinValue?

CEVAP
30 NİSAN 2009, PERŞEMBE


SQL arasındaki fark bu bence .NETTarihveri türleri SQL Server olmasından kaynaklanıyordatetimeveri türü, en küçük ve en büyük değerler ve hassasiyet çok daha yaşlı .NET DateTime veri türü.

Gelişiyle .NET, takım Datetime veri türü daha fazla olması gerektiğine karar verdidoğalminimum değeri, ve 01/01/0001 oldukça mantıklı bir seçim, kesinlikle görünüyorprogramlama diliyerineveritabanıbakış açısı, bu değer daha doğal.

Bu arada, SQL Server 2008, bir numara, yeni bir Tarih tabanlı veri türleri (Date, Time, DateTime2, DateTimeOffset) aslında bunu teklif arttırıldı ve hassasiyetle yakından göster için DateTime veri türü .NET. Örneğin, DateTime2 veri türü 0001-01-01 ile 9999-12-31 gelen bir tarih aralığı vardır.

Standart "datetime" SQL Server türü her zaman 01/01/1753 en az bir değeri (ve aslında hala var!): büyük veri. İtiraf etmeliyim ki, ben aşağıdaki gibi de bu değer önemini merak, biraz araştırma buldum.. Ne mi oldu

1 A. D. ve bugün arasında, Batı dünyası aslında iki ana takvimleri kullandı döneminde: Julius Sezar ve Papa Gregory XIII Gregoryen takvimi Jülyen takvimi. İki takvimleri tek bir kuralına göre farklılık gösterir: bir yılda ne karar vermek için kuralı. Jülyen takvimi, her yıl dört ile bölünebilen artık yıllar vardır. Gregoryen takvimi, her yıl dört ile bölünebilen artık yıllar, yılda 100 ile bölünebilen (ama 400'e bölünebilen) yıllar artık olmamasının dışında. Böylece, 1700, 1800 ve 1900 yılları 1600 ve 2000 süre Jülyen takviminde artık yıl ama Gregoryen takvim değil, yılda iki takvimdeki yıl sıçrama.

Ne zaman Papa Gregory XIII tanıttı onun takvim 1582, o da yönetmen o günleri arasında 4 Ekim 1582 ve 15 Ekim 1582 gereken atladı, dedi o günden sonra 4 Ekim olmalı 15 Ekim. Birçok ülke değişiyor, ama gecikmiş. İngiltere ve kolonileri 1752, onlar için 4 Eylül tarihleri arasında atlandı ve 14 Eylül 1752 kadar Gregoryen hesaplaşma için Julian geçiş yoktu. Diğer ülkeler başka bir zaman geçti, ama 1582 ve 1752 tartışıyoruz ki DBMSs için ilgili tarihler.

Böylece, iki sorun bir çok eskilere dayanıyor tarih ile aritmetik ortaya çıkar. İlk yıl geçiş Julian ya da Gregoryen kurallara göre hesaplanacak önce sıçrama gerekir. İkinci sorun, ne zaman ve kaç gün kullanılmalıdır atlanır?

Bu Büyük Sekiz DBMSs bu soruları nasıl ele

  • Anahtarı vardı yok gibi. Bu ne SQL Standart görünüyor gerektirir, ancak standart belge belirsiz: sadece yazan tarihler "kısıtlı tarafından doğal kuralları için kullanma tarihleri Gregoryen takvim"—ne "doğa kuralları" vardır. Bu DB2 seçti seçenektir. Tek bir takvim kuralları her zaman bile, kimse bu takvim duyunca kez uygulanan bir bahanesi var, teknik bir terim "" takvim yürürlüktedir. proleptic olmasıdır Bu yüzden, örneğin, DB2 proleptic Gregoryen takvimi şöyle söyleyebiliriz.

  • Sorun tamamen önlemek.En az kendi tarihini ayarlamak Microsoft Amerika takvimleri geçiş güvenli bir şekilde geçmiş zaman Ocak 1, 1753, değerleri. Bu savunulabilir, ancak zaman zaman şikayetler bu iki DBMSs diğer DBMSs ve SQL Standart gerektiren yararlı bir işlevi olmayan yüzey.

  • 1582 seç. Bu torpil yaptı. Bir Oracle kullanıcı bulmak o tarih-aritmetik ifade 15 Ekim 1582 eksi 4 Ekim 1582 verim değeri 1 gün (çünkü Ekim 5-14 yok) ve Tarih 29 Şubat 1300 geçerli (çünkü Julian artık yıl kuralı geçerlidir). Neden Oracle SQL Standart bunu gerektirir görünmüyor ekstra zahmete mi? Cevap kullanıcıların gerektirebilir. Tarihçiler ve astronomlar proleptic Gregoryen takvimi yerine bu özel sistem kullanın. (Bu da Güneş hibrid bir takvim GregorianCalendar Java rağmen adı GregorianCalendar sınıfı, uygularken aldığı varsayılan seçenektir.)

Bu yukarıda tırnak aşağıdaki linkten alınmıştır:

SQL Performance Tuning: Dates in SQL

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • ecf150king

    ecf150king

    20 Ocak 2006
  • Julian Smith

    Julian Smith

    31 EKİM 2006