SQL Server 2008 ile birlikte gelen birçok yenilikten biri de,yeni veri tipleridir.SQL Server 2008’de daha önceki sürümlerde kullandığımız int,varchar,float.datetime gibi veri tiplerine ek olarak sınırlarımızı daha da genişleten yeni veri tipleri karşımıza çıkmaktadır. SQL Server 2008 ile gelen;bu yeni veri tiplerini aşağıdaki gibi bir gruplamaya sokabiliriz.(Bu makalemizde ikinci grup olan Date ve Time Veri Tipleri üzerinde duracağız) Ø Uzaysal Veri Tipleri: Bu veri tipleri GEOMETRY ve GEOGRAPHY veri tiplerini içermektedir. Bu verilere de Uzaysal Veriler denmektedir. Ø Yeni Date ve Time Veri Tipleri: Bu veri tipleri,esnek Date ve Time verilerinin tutulmasını sağlamaktadır.Örneğin;1753 yılından önceki yılların yada 3.33 milisaniye den daha kısa zaman aralıklarının,veri tabanında saklanmasına imkan sağlıyorlar. Ø Hierarchyid Veri Tipleri : Hiyerarşik verilerin tutulduğu tipler.Örneğin; çalışan => müdür ilişkisinin tutulmasına imkan sağlayan veri tipleridir. Ø FileStream Desteği : Büyük objelerin dosyalarda tutulması ve bu dosyaların database ile entegrasyonun sağlanması ise veri tiplerine getirilen bir başka kullanışlı yeniliktir. Şimdi;yeni Date ve Time Veri Tiplerine ve sağladığı imkanlara bakalım.(Bir önceki bağlı makalemizde 1.grup olan Uzaysal Veri Tiplerini incelemiştik)
2)SQL Server 2008’de Yeni Date ve Time Veri Tipleri : SQL Server 2008 öncesi;SQL Server sürümlerinde zamansal datalarımızı datetime veya smalldatetime veri tipleri üzerinde tutuyorduk.Bu zamansal veri tiplerini kullanırken de bazı kısıtlamalar ile karşı karşıyaydık.Örneğin datetime veri tipimizin kapsadığı tarih aralığı;1 Ocak 1753 ‘den başlayıp 31 Aralık 9999 ‘a kadar gidebiliyordu. 1753 yılından önceki tarihlerin tutulmasını gerektiren bir uygulama geliştireceğimiz zamanda bu veri tiplerini daha farklı veri tipleri üzerinde tutmamız gerekmekteydi.(Örneğin bir müzede ki tarihi eserlerin verilerinin tutulduğu bir veri tabanına 1753 öncesi tarihleri nasıl girebilirdiniz ? ) Datetime tipiyle ilgili bir başka kıstlamamız ise 3.33 milisaniyeden daha hassas zaman dilimlerindeki verileri,datetime tipiyle tutamayacak olmamızdı,bu durum özellikle finansal yada bilimsel uygulamaların veri tabanlarını tasarlayanlar için zorluklardan biriydi. Zamansal veriler üzerinde ki karşılaşılan bu zorluklara ,SQL Server 2008 ile gelen,yeni Date ve Time tipleriyle çözüm bulabiliyoruz artık Yeni Date ve Time Veri Tiplerimiz: SQL Server 2008; DATE, TIME, DATETIMEOFFSET,ve DATETIME2 olmak üzere 4 yeni tarihsel veri tipiyle karşımıza çıkmaktadır.Bu yeni tarihsel tiplerimiz sayesinde;1753 yılı gibi sınırlamaların ortadan kalkmasının yanında,nanosaniyeler ölçüsünde zamansal kayıtları tutabilme,Bölgesel Zaman Ayarlarına bağlı değişiklikleri kullanabilme imkanlarına sahip oluyoruz. SQL Server 2008’e getirilmiş olan;bu yeni zamansal veri tipleri,diğer SQL Server veri tipleriyle ortak sorgularda kullanılabilmekte;DML (Data Manipulation Language) ve DDL(Data Definition Language),Store Procedurelerde yani SQL Server deyince aklınıza gelen bütün yapılar ile beraber sorunsuz bir şekilde çalışmaktadır. SQL Server 2000 yada SQL Server 2005 kullanıcıları; Server Management Objets(SMO) aracılığıyla,yeni date ve time veri tiplerinin değerlerine ulaşmak istediğinde,text-string olarak değerlere ulaşabiliyorlar.(Bu da hatanın oluşmasının önüne geçiyor.)Aynı zamanda,bu yeni veri tiplerimiz OLE DB ve ODBC’ye de SQL Native Client aracılığıyla tam destek sunmaktadırlar.Visual Studio 2008’de geliştirdiğimiz ADO.Net projelerinde de bu veri tiplerine tam destek mevcutdur. Şimdi bu 4 yeni veri tipimize ayrıntılı olarak bakmanın zamanı geldi. a)DATE Tipi : Bu yeni zamansal veri tipimiz;Gregorian takvimini esas alarak 1 ile 9999 arası yıl değerlerini tutabilir.Diyelim ki çalışanların doğum tarihlerini yada işe başlama tarihlerini tutacak bir şema tasarlamak istiyorsunuz;eğer burada ki değerleri datetime tipinden oluşturursanız 6 byte’lık bir alan kaplayacaklardır.Fakat bu tarihsel alanınızı; yeni DATE tipinden tanımlarsanız sadece 3 byte’lık bir alan kapladığını göreceksiniz.Şuan için aradaki bu fark çok dikkat çekici olmayabilir ama tüm veri tabanınızı düşündüğünüz zaman bu yeni tipin faydasını daha açık olarak görebilirsiniz. Verilerin kapladığı alanlarla ilişkili kaygılarınızdan dolayı; ay ve gün bilgisi için tinyints (1 byte) ,yıl için de smallint (2 byte) bir veri türü tanımlaması yapsanız bile gene toplamda 4 byte yapar ki,DATE türüne göre 1 byte fazla bir alan kaplanır.Diğer taraftan integer’ları kullanarak yaptığınız tanımlamalarda,iç fonksiyonların(DATEPART, DATENAME, DATEDIFF,DATEADD) kullanmak için ekstra çaba harcamanız gerekmesine rağmen DATE tiplerinde böyle bir ekstra çabaya gerek bile yoktur. Buraya kadar anlatılanları küçük bir sorgu aracılığıyla görürsek daha iyi anlaşılacaktır.(Sorgumuzu yazmadan önce DATE tiplerinde tarih sırasının YYYY-MM-DD olarak gösterildiğini belirteyim.) DECLARE @bugun DATE DECLARE @yeniyil DATE SET @bugun = SYSDATETIME() SET @yeniyil = '2010-12-31' SELECT @bugun as 'Bugunun Tarihi', DATEADD(week,1,@bugun) as'Bir Hafta Sonra Bugun', DATEDIFF(day,@bugun ,@yeniyil) as'Yeni Yıla Kalan Gun ', DATALENGTH(@bugun) as 'Veri Kaç Byte ? '
DATETIME2(n) veri tipi,gene hassasiyet derecesine göre değişmek kaydıyla 6 ile 8 byte arasında bir alan kaplar.Bu veri tipimiz daha önce kullanılan datetime tipinin SQL Server 2008 deki karşılığı olarak değerlendirilip,yeni tiplere geçişte kullanılabilir.
DATALENGTH(SYSDATETIME()) as 'Kapladıgi Alan '
b)SYSUTCDATETIME Fonksiyonu: SYSUTCDATETIME fonksiyonu, SYSDATETIME fonksiyonuna benzer şekilde çalışır sistem timestamp’ini UTC formatında gösterir. SELECT SYSUTCDATETIME() as 'Şuan ki Zaman', DATALENGTH(SYSUTCDATETIME()) as 'Kapladıgi Alan ' c)SYSDATETIMEOFFSET Fonksiyonu:Önceki 2 fonksiyona benzer şekilde sistem timestamp değerini döndürmeye ek olarak,bölgesel saat farklılık değerini de verir.(Gene DATETIME2(7) formatında) SELECT SYSDATETIMEOFFSET() as 'Şuan ki Zaman', DATALENGTH(SYSDATETIMEOFFSET()) as 'Kapladıgi Alan ' d)TODATETIMEOFFSET Fonksiyonu: Bu fonksiyon yerel saat ve zaman değerlerini,date-time offset UTC değerine dönüştürerek gösterir. DECLARE @OffsetYok DATETIME2 DECLARE @OffsetVar DATETIMEOFFSET SET @OffsetYok=sysdatetime() SET @OffsetVar=TODATETIMEOFFSET(@OffsetYok,'+02:00') SELECT @OffsetYok AS 'Offset Olmadan', @OffsetVar AS 'Offset Eklenirse' e) SWITCHOFFSET Fonksiyonu : SWITCHOFFSET fonksiyonu;verilen başka bölgeye ait bir zaman diliminin,bulunan zaman dilimindeki karşılığını elde edebilme imkanı sağlamaktadır.Örneğin 2 Ocak 2010 tarihinde Londra saatiyle 01:30’da başlayacak bir webinerin,İstanbul saatiyle kaçta başlayacağını bulmak istediğimizi varsayalım. DECLARE @Webinerin_Zamani DATETIMEOFFSET SET @Webinerin_Zamani ='2010-01-02 01:30 +00:00' SELECT @Webinerin_Zamani AS 'Webinerin Londrada Başlayacağı Zaman', SWITCHOFFSET(@Webinerin_Zamani,'+02:00') AS 'Webinerin Istanbulda Başlayacağı Zaman' Görüldüğü gibi Webinerimiz Türkiye saatine göre 03:30’de başlayacaktır. Bu makalemizde SQL Server 2008 ‘in yeni veri tiplerinden olan Date-Time Veri Tiplerini ve kullandığı fonksiyonlarını,örnek sorgularla inceledik. Bu makaleye bağlı makalelerde SQL Server 2008 ile gelen yeni veri tiplerini incelemeye devam edeceğiz
Başka bir Microsoft SQL Server 2008 makalesinde görüşmek dileğiyle...
Bilgehan Gürünlü
www.gurunlu.com bilgehan@gurunlu.com
Kaynaklar :
-http://msdn.microsoft.com/en-us/library/ -Accelerated SQL Server 2008 -Programming Microsoft® SQL Server 2008 (Ms-Press)