(Tarih ve Zaman ile İlgili Yenilikler)
SQL Server 2008 Tarih ve zaman ile ilgili yıllardır ertelene gelen problemlerin çözüme kavuşturulmuş halini içermesi nedeniyle dikkat çekici. SQL Server ile bir ders programı uygulaması yazdığınızı düşünün. Tarih değil sadece zaman tutmak istediğiniz durumlarda SQL Server 2005 sürümü de dahil size destek sağlamıyordu. Ya zaman bilgisi için tarih de belirtmeniz gerekiyordu veya veri tipi olarak DateTime dışında bir şeyler kullanmanız… SQL Server’ın son sürümünün tarih ve zaman hakkındaki yeni veri tipleri ve fonksiyonlarını bu makalede ele alacağız.
İlgili Makaleler
Temel Tipler, Değişken Tanımlamalarla İlgili Yenilikler(T-SQL 2008 Yenilikler-1)
Tarih ve Zaman Veri Tipleri
SQL Server 2008 tarih ve zaman ile ilgili veri tiplerine,
SQL Server adına yeni bir bakış açısı getiriyor. Sağlanan dört yeni veri tipi
ve kullanım şekillerini teker teker ele alalım:
|
Veri tipi
|
ADO.NET Karşılığı
|
Açıklama
|
|
TIME
|
TimeSpan
|
Tarih hakkında bir bilgi içermez. Sadece günün hangi anı
olduğuna dair bilgi tutabilir
|
|
DATE
|
DateTime
|
Gün ay ve yıldan ibaret bir günü belirtebilir. Zaman
belirtemez.
|
DATETIME
SMALLDATETIME
|
DateTime
|
SQL Server 2005 ve aşağısı için geçerli olan, SQL Server
2008 tarafından da geriye uyum için desteklenen tipler
|
|
DATETIME2
|
DateTime
|
İşlev olarak eski klasik DateTime(SQL Server 2005 ve
aşağısı) veri tipine karşılık gelmekte olup hem tarih hem de zamanı bir arada
tutabilir.
|
|
DATETIMEOFFSET
|
DateTimeOffset
|
DATETIME2 tipi ile aynı özellikleri taşımanın yanı sıra tarih
ve zamanın dünya üzerindeki hangi coğrafi zaman dilimi esas alınarak
verildiğini de tutabilmekte.
|
Tablo 1: SQL Server 2008’de gelen yeni tarih, zaman tipleri
Örnek-1:
İçinde bulunduğumuz anın zaman bilgisini, tarih bilgisini, tarih-zaman
bilgisini ve saat dilimi ile birlikte tarih-zaman bilgisini sabit bir değerden
okuyabilen bir örnek şu şekilde olabilir:
DECLARE
@zaman AS TIME = GETDATE(),
@tarih AS DATE = GETDATE(),
@tarihZaman AS DATETIME2 = '2009-02-12 12:30:15.1234567',
@tarihZamanGMT AS DATETIMEOFFSET = '2009-02-12 12:30:15.1234567 +02:00';
SELECT @tarih tarih, @zaman zaman,
@tarihZaman tarihZaman, @tarihZamanGMT tarihZamanGMT;

Şekil-1: SQL Server 2008’de gelen yeni tarih, zaman tipleri
Örnek sonuçlarındaki özellikle zaman değerlerinin uzayıp
gitmesi eminim dikkatinizi çekmiş olmalı. SQL Server 2008 saniyeden sonra 7
haneli bir hassasiyet sağlıyor (Önceki sürümde datetime saniyeden sonra 3 hane hassasiyette
idi) ve bu hassasiyet 100 nano saniyeye karşılık geliyor. Bu türden bir hassasiyet,
bilim üretmiyorsanız uygulamada sadece görüntü kirliliği olarak algılanabilir. Bu
nedenle de TIME, DATETIME2 ve DATETIMEOFFSET türünden değişkenler için hassasiyet
verilebilecek şekilde bir tip sistemi tasarlanmış.
DİKKAT:
DATE türü için hassasiyet zaten gün ile sınırlı olduğu için
ayrıca hassasiyet belirlenemiyor. Diğer zaman içeren tipler için saniyeden
sonraki ifade etmek üzere 0 ile 7 arasında bir hassasiyet verilebilir.
Örnek-2:
Bir önceki örneğimizde, sadece zaman tutan değişkeni(Bunu
tablo tasarlarken sütun tipi diye de düşünebilirsiniz) sıfır hassasiyetle,
tarih ve zamanı birlikte tutan değişkeni 1 hassasiyetle ve saat dilimi, tarih
ve zaman tutan değişkeni de 3 hassasiyet ile tanımladığımızda elde edilen sonuç
görünmekte

Şekil-2: Zaman türünden değişkenlerde hassasiyet 0-7
arasında değerler alabiliyor.
Yeni Tarih ve Zaman Fonksiyonları
Tip sistemindeki bu yeniliklere paralel olarak bir dize yeni
fonksiyon ve var olan fonksiyonlarda yenilikler SQL Server 2008’in parçası
olarak yer almakta.
Tarih ve zaman fonksiyonlarına geçmeden önce UTC’nin ne
olduğu hakkında kısa bir bilgi edinmek gerekebilir. Global bir dünyada farklı
noktalarda aynı an olmasına rağmen farklı saatler geçerlidir. Örneğin, Ankara’da
saat 12:00 iken İngiltere’de 10:00 olabilmektedir. Bazı hassas verilerin yerel
değil de global olarak hangi saatte oluştuğunu bilmek, farklı şubelerde elde
edilen verileri kıyaslamak için kaçınılmazdır.
UTC wikipedia’ya göre, Eşgüdümlü Evrensel Zaman olarak anılmakta
ve 0 meridyeni(Greenwich, İngiltere) üstündeki zamanı esas alarak diğer
bölgelerin kullandığı saat sisteminin göreceli farkını gösteren bir referans değerdir.
Örneğin Türkiye kışları UTC+2, yazları da UTC+3 zamanını kullanmaktadır.

Şekil 3: UTC’ye göre çeşitli ülkelerin yerel saat farkları
|
Fonksiyon
|
Açıklama
|
|
SYSDATETIME
|
DATETIME2 türünde, sistemde anlık tarih ve zaman bilgisini
döndürür.
|
|
SYSUTCDATETIME
|
UTC zamanını(İngiltere’de yerel saat) DATETIME2 türünde
döndürür.
|
|
SYSDATETIMEOFFSET
|
UTC’ye göre ofset(referans noktasından yönlü uzaklık)
bilgisi ile birlikte yerel SQL Server saatini döndür.
|
|
SWITCHOFFSET
|
Herhangi bir tarihi başka bölge tarihine çevirmek için
kullanılır. Girdi tarihte ofset bilgisinin bulunması gerekir.
|
|
TODATETIMEOFFSET
|
Herhangi bir tarihi koruyarak sadece UTC Offset değerini
ekler veya varsa değiştir. Örneğin Türkiye’de yaz saatinden geri almayı
unuttuğunuz bir veri için saatleri geri aldıktan sonra ara bölgedeki verileri
de offsetswitch ederek doğru zamana getirmek için kullanılabilir.
|
Örnek-3:
UTC referans değerini, yerel sistem saati ve UTC referans farkını,
sistem saatinin UTC-5 zaman dilimindeki halini ve sistem saatinin -5 zaman
diliminde imiş gibi gösterilmesini içeren bir örnek sorgu
SELECT SYSUTCDATETIME() UTC,
SYSDATETIMEOFFSET() OFFSET,
SWITCHOFFSET(SYSDATETIMEOFFSET(), '-05:00') [SWITCH-5],
TODATETIMEOFFSET(SYSDATETIMEOFFSET(), '-05:00') [TODATETIME-5]

Şekil -4: UTC ile ilgili tarih-zaman fonksiyonlarının
çalışma şekilleri ve sonuçları
Sonuç
Her ne kadar geçmiş sürümlerin tarih-zaman tip sistemine tam
destek sağlasa da, SQL Server 2008 ile birlikte tamamen yeniden tasarlanmış
bir SQL Server tip sistemi ile karşı karşıyayız.