[font=tahoma, geneva, lucida,]Microsoft SQL Server'da geliştirme yaparken bilindiği üzere T-SQL dili kullanılmaktadır. T-SQL dili her ne kadar geliştirme yapmak için üstün yeteneklere sahip bir dil olsa bile bazı durumlarda veritabanı geliştirme konusunda ihtiyaçlarımızı karşılayamayabilmektedir. Bu gibi durumlarda Microsoft .Net kütüphaneleri kullanılarak geliştirilen Assembly'ler SQL Server'a CLR (Common Language Runtime) entegrasyonu ile eklenerek istenilen geliştirmeler yapılabilmektedir. Bu yazımızda Microsoft .Net kodları ile geliştirilen ve derlenen Assembly'lerin SQL Server'a nasıl import edileceği ile ilgili konulara örnek bir uygulama ile değineceğiz.--
-
[font=tahoma, geneva, lucida,]Günümüzde bazı işletmeler yapılan işlemlerin tarih ve saatlerini SQL Server tablolarında tutarken UTC (Universal Time Coordinated) formatında tutmaktadırlar. UTC , GMT (Greenwich Mean Time) ve CET (Central European Time) ile aynı anlama gelmektedir. SQL Server veritabanlarında UTC olarak tutulan bir zaman değerinin, dünyanın farklı bölgelerinden yapılacak olan sorgularda, sorgunun yapıldığı yerel bölgedeki Local Time değerine dönüştürülmesi istenebilir. Böyle bir senaryo ile karşılaşıldığında T-SQL dilinin built-in fonksiyonları akla gelebilir. DATEADD(), DATEDIFF() ve GETUTCDATE() gibi fonksiyonları iç içe kullanarak bir noktaya kadar çözüm geliştirilebilir. Ancak dünyada neredeyse bütün ülkelerde uygulanan “Yaz Saati Uygulaması” sebebiyle bu fonksiyonlardan dönecek olan değer tutarlı olmayacaktır. Örneğin ülkemizde Yaz Saati Uygulaması başlamadan UTC ile olan saat farkı +02:00 iken, Yaz Saati Uygulaması başladığında ise bu fark +03:00 olarak uygulanmaktadır. Peki hem Yaz Saati Uygulamasını dikkate alacak, hem de UTC ile olan saat farkını doğru olarak hesaplayacak hazır bir T-SQL fonksiyonu var mıdır? Heyecanlandığınızı biliyorum, ancak henüz SQL Server 2012 ile beraber böyle bir fonksiyon ne yazık ki bulunmamaktadır.---
[font=tahoma, geneva, lucida,]O zaman, SQL Server’da UTC Time olarak tutulan bir tarihin Local Time değerine çevrilmesi için ne yapılması gerekiyor? Bu makalemizde adım adım bu işlemi gerçekleştireceğiz.---
[font=tahoma, geneva, lucida,]Öncelikle bu işlemi gerçekleştirmek için SQL Server .NET CLR Integration yöntemini kullanarak SQL Server’da olmayan bir fonksiyonu C# kodu ile geliştirip SQL Server’a entegre edeceğiz ve böylelikle SQL Server özelliklerini CLR Integration ile extend etmiş olacağız. İsterseniz adım adım başlayalım:---
-
[font=tahoma, geneva, lucida,]Günümüzde bazı işletmeler yapılan işlemlerin tarih ve saatlerini SQL Server tablolarında tutarken UTC (Universal Time Coordinated) formatında tutmaktadırlar. UTC , GMT (Greenwich Mean Time) ve CET (Central European Time) ile aynı anlama gelmektedir. SQL Server veritabanlarında UTC olarak tutulan bir zaman değerinin, dünyanın farklı bölgelerinden yapılacak olan sorgularda, sorgunun yapıldığı yerel bölgedeki Local Time değerine dönüştürülmesi istenebilir. Böyle bir senaryo ile karşılaşıldığında T-SQL dilinin built-in fonksiyonları akla gelebilir. DATEADD(), DATEDIFF() ve GETUTCDATE() gibi fonksiyonları iç içe kullanarak bir noktaya kadar çözüm geliştirilebilir. Ancak dünyada neredeyse bütün ülkelerde uygulanan “Yaz Saati Uygulaması” sebebiyle bu fonksiyonlardan dönecek olan değer tutarlı olmayacaktır. Örneğin ülkemizde Yaz Saati Uygulaması başlamadan UTC ile olan saat farkı +02:00 iken, Yaz Saati Uygulaması başladığında ise bu fark +03:00 olarak uygulanmaktadır. Peki hem Yaz Saati Uygulamasını dikkate alacak, hem de UTC ile olan saat farkını doğru olarak hesaplayacak hazır bir T-SQL fonksiyonu var mıdır? Heyecanlandığınızı biliyorum, ancak henüz SQL Server 2012 ile beraber böyle bir fonksiyon ne yazık ki bulunmamaktadır.---
[font=tahoma, geneva, lucida,]O zaman, SQL Server’da UTC Time olarak tutulan bir tarihin Local Time değerine çevrilmesi için ne yapılması gerekiyor? Bu makalemizde adım adım bu işlemi gerçekleştireceğiz.---
[font=tahoma, geneva, lucida,]Öncelikle bu işlemi gerçekleştirmek için SQL Server .NET CLR Integration yöntemini kullanarak SQL Server’da olmayan bir fonksiyonu C# kodu ile geliştirip SQL Server’a entegre edeceğiz ve böylelikle SQL Server özelliklerini CLR Integration ile extend etmiş olacağız. İsterseniz adım adım başlayalım:---
- -CLR Integration Aktifleştirilmeli-
[font=tahoma, geneva, lucida,]
1USE master-
---
[font=tahoma, geneva, lucida,]
---
[font=tahoma, geneva, lucida,]Bir sonraki aşamada açılan sayfadaki kodların tamamını silip aşağıdaki kod bloğunu sayfamıza ekliyoruz:---
1USE master-
---
- -UTC Time Değrini Local Time Değerine Dönüştüren C# Kodu Yazılmalı-
[font=tahoma, geneva, lucida,]
[font=tahoma, geneva, lucida,]Bir sonraki aşamada açılan sayfadaki kodların tamamını silip aşağıdaki kod bloğunu sayfamıza ekliyoruz:---
[font=tahoma, geneva, lucida,]
01using System;-
---
[font=tahoma, geneva, lucida,]Bu işlemden sonra ister F6 tuşuna basarak, istersek de BUILD menüsü altında bulunan “Build Solution” tıklayarak projeyi derliyoruz. Derleme işlemi tamamlandığında yazılan kodların yanında bulunan sarı renkli gösterge yeşil renge dönecektir.---
[font=tahoma, geneva, lucida,]
---
[font=tahoma, geneva, lucida,]
---
[font=tahoma, geneva, lucida,]Oluşturulan assembly SQL Server CLR Integration metodu ile kullanıma alınmış durumdadır.---
01using System;-
---
[font=tahoma, geneva, lucida,]Bu işlemden sonra ister F6 tuşuna basarak, istersek de BUILD menüsü altında bulunan “Build Solution” tıklayarak projeyi derliyoruz. Derleme işlemi tamamlandığında yazılan kodların yanında bulunan sarı renkli gösterge yeşil renge dönecektir.---
[font=tahoma, geneva, lucida,]
- -Oluşturulan DLL Dosyası SQL Server’ın Kullanımına Alınır-
[font=tahoma, geneva, lucida,]
[font=tahoma, geneva, lucida,]Oluşturulan assembly SQL Server CLR Integration metodu ile kullanıma alınmış durumdadır.---
- -UTC ile Local Time Arasında Dönüşüm Yapacak Olan Fonksiyon Eklenen Assembly’den Oluşturulur-
[font=tahoma, geneva, lucida,]
1USE AdventureWorks2012-
---
[font=tahoma, geneva, lucida,]Bu işlemin ardından ilgili database altında (benim senaryom için AdventureWorks2012) ConvertToLocalTime() adında bir SQL CLR Integration Function oluşturulmuş olacaktır.---
[font=tahoma, geneva, lucida,]Oluşturduğumuz fonksiyon bir adet datetime veri tipinde parametre alacak ve aldığı bu değeri Yaz Saati Uygulamasını dikkate alarak yerel zamana çevirecektir.---
[font=tahoma, geneva, lucida,]Aşağıda oluşturulan fonksiyonun çalıştırılması test edilmiştir:---
1USE AdventureWorks2012-
---
[font=tahoma, geneva, lucida,]Bu işlemin ardından ilgili database altında (benim senaryom için AdventureWorks2012) ConvertToLocalTime() adında bir SQL CLR Integration Function oluşturulmuş olacaktır.---
[font=tahoma, geneva, lucida,]Oluşturduğumuz fonksiyon bir adet datetime veri tipinde parametre alacak ve aldığı bu değeri Yaz Saati Uygulamasını dikkate alarak yerel zamana çevirecektir.---
[font=tahoma, geneva, lucida,]Aşağıda oluşturulan fonksiyonun çalıştırılması test edilmiştir:---
[font=tahoma, geneva, lucida,]
1USE AdventureWorks2012-
---
[font=tahoma, geneva, lucida,]Elde edilen sonuçlar aşağıdaki gibidir:---
[font=tahoma, geneva, lucida,]
---
[font=tahoma, geneva, lucida,]Görüldüğü üzere ConvertToLocalTime() fonsiyonuna farklı değerler verilerek farklı yıllardaki Yaz Saati Uygulaması’nı da dikkate aldığını ve Yaz Saati Uygulamasının aktif olduğu aylarda +03:00, Yaz Saati Uygulamasının aktif olmadığı aylarda +02:00 saat eklendiği görülmektedir.---
1USE AdventureWorks2012-
---
[font=tahoma, geneva, lucida,]Elde edilen sonuçlar aşağıdaki gibidir:---
[font=tahoma, geneva, lucida,]
[font=tahoma, geneva, lucida,]Görüldüğü üzere ConvertToLocalTime() fonsiyonuna farklı değerler verilerek farklı yıllardaki Yaz Saati Uygulaması’nı da dikkate aldığını ve Yaz Saati Uygulamasının aktif olduğu aylarda +03:00, Yaz Saati Uygulamasının aktif olmadığı aylarda +02:00 saat eklendiği görülmektedir.---
