Makale Özeti

Bu makalemizde SQL Server 2008 ‘in yeni veri tiplerinden olan Date-Time Veri Tiplerini ve yeni sistem fonksiyonlarının kullanımlarını,örnek sorgularla inceleyeceğiz.

Makale

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 ? '



Bu yazmış olduğum sorguya dikkatlice bakanların gözüne;SYSDATETIME() fonksiyonu ,takılmıştır herhalde.Buradaki SYSDATETIME() fonksiyonu,SQL Server 2008 ile gelen yeni 5 fonksiyondan biridir.Yapmış olduğu işe gelince;zamanı DATETIME2(7) tipinde döndürmektir.(Tüm bu yeni fonksiyon ve tipler bu makalenin ilerleyen satırlarında anlatılacaktır.)

b)TIME Tipi :Yeni TIME(n) tipimiz;00:00:00.0000000 ile 23:59:59.9999999 aralığındaki zamanı saklamaktadır.Bu zamansal tipimiz 100 nanosaniye’den daha küçük zaman aralıklarını bile destekler.Buradaki “n”  ifadesiyse 0’dan 7’ye kadar sayılar alarak zaman bölümlemesinde ki hassasiyeti belirlememizi sağlar.
 
DECLARE @simdiki_zaman_0 time(0)
DECLARE @simdiki_zaman_1 time(1)
DECLARE @simdiki_zaman_2 time(2)
DECLARE @simdiki_zaman_3 time(3)
DECLARE @simdiki_zaman_4 time(4)
DECLARE @simdiki_zaman_5 time(5)
DECLARE @simdiki_zaman_6 time(6)
DECLARE @simdiki_zaman_7 time(7)
SET @simdiki_zaman_0=SYSDATETIME()
SET @simdiki_zaman_1=SYSDATETIME()
SET @simdiki_zaman_2=SYSDATETIME()
SET @simdiki_zaman_3=SYSDATETIME()
SET @simdiki_zaman_4=SYSDATETIME()
SET @simdiki_zaman_5=SYSDATETIME()
SET @simdiki_zaman_6=SYSDATETIME()
SET @simdiki_zaman_7=SYSDATETIME() 
SELECT @simdiki_zaman_0 as 'Suan ki Zamanımız', datalength(@simdiki_zaman_0) as 'Kaç Byte ?'
UNION ALL
SELECT @simdiki_zaman_1,datalength(@simdiki_zaman_1)UNION ALL
SELECT @simdiki_zaman_2,datalength(@simdiki_zaman_2)UNION ALL
SELECT @simdiki_zaman_3,datalength(@simdiki_zaman_3)UNION ALL
SELECT @simdiki_zaman_4,datalength(@simdiki_zaman_4)UNION ALL
SELECT @simdiki_zaman_5,datalength(@simdiki_zaman_5)UNION ALL
SELECT @simdiki_zaman_6,datalength(@simdiki_zaman_6)UNION ALL
SELECT @simdiki_zaman_7,datalength(@simdiki_zaman_7)


Burada da görüldüğü gibi;istenilen hassasiyete bağlı olarak verinin kapladığı alan da 3 ile 5 byte arasında değişmektedir.Ayrıca DATE tipinde olduğu gibi TIME tipi de DATEDIFF ve  DATEADD gibi fonksiyonları destekler.  

c)DATETIMEOFFSET Tipi :  DATETIMEOFFSET(n) veri tipi;DATETIME veri tipinin bölgesel saat farklılıklarının dikkate alındığı zamansal veri tipidir.Açılımı da “date + time + time-zone offset “ olarak düşünülebilir.Bulunan noktanın Coordinated Universal Time (UTC) ‘a göre alacağı saat farklılıklarını esas almaktadır.(UTC ile GMT aynı şeydir.) Örneğin İstanbul için bu farklılık +2 olarak ifade edilir.



SQL Server 2008 ile bu veri tipinin kullanıma SYSDATETIMEOFFSET() adında bir sistem fonksiyonu eklenmiştir.Bu fonksiyon ile tarih ve saati Bölgesel saat farklılıklarıyla beraber gösterebilme imkanı mevcutdur. 

SELECT SYSDATETIMEOFFSET() AS 'Şuan ki Tarih,Saat ve Time Zone Değeri'
GO


Buradaki saat farklılığı bilgileri İşletim Sistemin saatinden alınmaktadır.(Mevsimlere göre enerji tasarrufu için ,saat farklılıkları da işletim sistemine bağlı olarak değişecektir.)Burada da DATETIMEOFFSET(n) deki hassasiyet derecesi “n” e göre tipin kaplayacağı alan,byte olarak değişiklik gösterir.

Son olarak da kullanılabilecek,bölgesel farklılık değerlerinin -14 ile +14 arasında bir değer alacağını söylemekte fayda var.

d)DATETIME2 Tipi : DATETIME2(n) veri tipimiz önceki ;SQL Server sürümlerinde ki datetime tipinin geliştirilmiş şeklidir.Aslında bu veri tipi ANSI SQL standartlarına göre  TIMESTAMP olarak çağrılması gerekirken,zaten bir timestamp tipimiz SQL Serverda olduğundan dolayı geliştirici takım tarafından DATETIME2(n) olarak isimlendirilmiştir.

Bu yeni veri tipimizin,aralığı 1 Ocak 0001 yılından başlayıp,31 Aralık 9999 tarihine kadardır.Bu veri tipimiz DATETIMEOFFSET veri tipinden farklı olarak,bölgesel saat farklılıklarını barındırmaz

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.


DATETIME2(n) veri tipi sadece ANSI SQL Standartlarına göre değil, NET  Datetime tipiyle de sorunsuz bir şekilde çalışır.
 Buraya kadar SQL Server 2008 ile gelen 4 yeni tarihsel veri tipimizi gördük,bu makalemizin bundan sonra ki kısmında yeni gelen zamansal fonksiyonlarımızı inceleyeceğiz

Yeni Date ve Time Sistem Fonksiyonlarımız
SQL Server 2008’de yeni eklenen date ve time veri tiplerinin;yanı sıra 5 tane de bu tiplerle ilişkili sistem fonksiyonu eklenmiştir.Bunlardan;SYSDATETIME,SYSUTCDATETIME ve SYSDATETIMEOFFSET,fonksiyonu timestamp tipinden sonuçlar döndürürken, TODATETIMEOFFSET ve SWITCHOFFSET fonksiyonları ise adlarından da anlaşılacağı gibi bölgesel zaman dilimlerine göre date ve time değerlerimizi döndürecektir.

Şimdi bu fonksiyonlara ve kullanımlarına sırasıyla bakalım.

 a) SYSDATETIME Fonksiyonu :SYSDATETIME fonksiyonu; DATETIME2(7) formatında timestamp değerini bölgesel saat farklılıklarını göstermeden döndürür. 

SELECT SYSDATETIME() as 'Şuan ki Zaman',

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)