Anasayfa | Hakkımda | Kitaplarım | RSS Site içinde
Kategoriler
» SQL Server 2012
» SQL Server 2008
» C#
» MySQL
» Hayata Dair
» Güncel Haber-Duyuru
» Bir Soru Bir Cevap
» Oracle ve Diğer VTYS
» Java

Transact SQL’de SQL Server 2008 Yenilikleri-2

28.10.2008 22:11:34
(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.

Yorumlar

Veli BOZATLI yorumladı(28.11.2008 09:51:44)
Teşekkürler
Çok yalın bir dille anlatılmış ve çok yararlı bir makale olmuş bence. Emeğinize sağlık...



Konuya müdahil olmak ister misiniz?
Başlık:  
İsim  :  
URL   :
Yorum