DateTime2, DateTime veri tipine göre daha yenidir. Sql Server 2008’de karşılaştığımız bu veri türü daha uzun tarih aralıklarını ve salise hassasiyeti olarak daha detaylı veri saklar. Daha yeni olduğundan daha fazla “uyumlu” ve daha fazla “taşınabilir” özelliklere sahip. Ayrıca Microsoft, hem daha yeni hem de daha fazla saniye hassasiyeti sağladığından DateTime yerine DateTime2 kullanılmasını önerir. Ayrıca DateTime2 daha geniş bir tarih aralığına + daha yüksek doğrulukla saniye hassasiyetine + kullanıcı tanımlı saniye hassasiyetine (zorunlu değil) sahiptir. Avantajlarına rağmen mevcut yapıyı değiştirmek bazı matematiksel fonksiyonların çalışmasına engel olabilir. “İşlevsel açıdan farklar” başlığı altında bundan biraz bahsettim. Aşağıda başlıklar halinde farkları açıkladım en altta ise tabloda özet olarak listeledim.
DateTime ve DateTime2 arasındaki kapasite açısından farklar
1)- DateTime kullanmanın geçmişe dönük (1753-01-01 00:00:00) olarak bir sınırlaması var. DateTime’ı çalışırken genellikle kayıt tarihi, loglama veya ileri tarihli işlemler oluşturmak için kullandığımızdan 1753 gibi tarihlere ihtiyaç duymayız. Ancak 01.01.1753 tarihinden geriye gittiğimizde Sql Server bize DateTime2’yi sunuyor (Alternatif olarak eğer sadece zaman olmadan tarih saklayacaksanız Date veri türü de işinizi görecektir).
2)- Hassasiyet açısından fark. DateTime zaman verisini hh:mm:ss:nnn (00:00:00:000) olarak saklarken DateTime2 hh:mm:ss:nnnnnnnnn (23:59:59.9999999) gibi oldukça uzun salise hassasiyetiyle saklayabilir.
DateTime ve DateTime2 arasındaki depolama farkı
DateTime tam 8 byte alan kaplarken DateTime2 hassasiyete bağlı olarak 6, 7 veya 8 byte olarak değişkendir.
DateTime2(n) şeklinde hassasiyet parametresi alabilir. Default değer 7’dir. 1, 2 parametreleri 6 byte, 3, 4 girilirse 7 byte, 5, 6, 7 değerleri de diskte 8 byte kaplar. Yani hassasiyet kapladığı alanla doğru orantılıdır.
DateTime saniye hassasiyetini her zaman yuvarlar
Biz SELECT GETDATE() şeklinde sorguladığımızda sonuçlar her zaman bize DateTime olarak .000, .003 veya .007 saniyelik artışlarla yuvarlanır. Yani aşağıdaki resimdeki 3 sonuçtan birini elde edersiniz.
Bu yüzden DateTime ile DateTime 2(3) parametreyi 3 olarak kullanmak rakam sayısı aynı olsa da benzer sonucu vermeyecektir. İlk veri tipinde 8 byte depolama alanından feragat edeceğiz DateTime 2(3) olarak tanımlayınca 7 byte kadar depolama alanı kullanacak.
DateTime ve DateTime2 arasındaki işlevsel açıdan farklar
İşlevsel açıdan farklar derken CAST etme, tarih ekleme-çıkarma kullanım durumlarında Datetime 2, DateTime gibi davranmaz. Kullanmaya başladıktan sonra kötü sürprizlerle karşılaşmamak için biraz bunlardan bahsedelim 🙂
+1 olarak işlem yapamıyoruz yani DECLARE DECLARE @ornekDateTime2 DATETIME2 = SYSDATETIME() SELECT @ornekDateTime2 +1 bu şekilde kullanımı Datetime veri tipi desteklerken DateTime 2 desteklemektedir. Bunun için DateAdd metodunu kullanabiliriz.
Halihazırda DateTime tipinde tablolarınız varsa bunları DateTime 2’ye çevirmeden önce uyumsuzlukları gidermek için sorgularınızı, stored procedure, trigger gibi yapılarınızı gözden geçirmenizde fayda var.
Aşağıdaki tabloda DateTime ve DateTime2 sql veri türü arasındaki önemli farkları özetlemektedir.
DateTime | DateTime2 | |
Minimum değer | 1753-01-01 00:00:00 | 0001-01-01 00:00:00 |
Maksimum değer | 9999-12-31 23:59:59.997 | 9999-12-31 23:59:59.9999999 |
Depolama | 8 byte | 6,7 veya 8 byte |
Doğruluk | 0,000, 0,003 veya 0,007 saniyelik artışlarla yuvarlanır | 100 nanosaniye |
Parametre | Almaz | 1-7 arası saniye hassasiyeti alır |
Varsayılan değer | 1900-01-01 00:00:00 | 1900-01-01 00:00:00 |
Uyumluluk | ANSI/ISO uyumlu değildir | ANSI/ISO uyumludur |
Kullanım | GetDate() metodu DateTime tipinde tarih ve saati döndürür Örnek: SELECT GETDATE() Sonuç: 02.10.2023 21:30:15:767 | SYSDATETIME() metodu DateTime 2 türünde tarih ve saati döndürür Örnek: SELECT SYSDATETIME() Sonuç: 02.10.2023 21:30:15.7673320 |