-
- Üyelik Tarihi
- 24 Mar 2017
-
- Mesajlar
- 4,578
-
- MFC Puanı
- 1,437
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.
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.
O zaman, SQL Serverda 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.
Öncelikle bu işlemi gerçekleştirmek için SQL Server .NET CLR Integration yöntemini kullanarak SQL Serverda olmayan bir fonksiyonu C# kodu ile geliştirip SQL Servera entegre edeceğiz ve böylelikle SQL Server özelliklerini CLR Integration ile extend etmiş olacağız. İsterseniz adım adım başlayalım:
Bir sonraki aşamada açılan sayfadaki kodların tamamını silip aşağıdaki kod bloğunu sayfamıza ekliyoruz:
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.
Oluşturulan assembly SQL Server CLR Integration metodu ile kullanıma alınmış durumdadır.
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.
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.
Aşağıda oluşturulan fonksiyonun çalıştırılması test edilmiştir:
Elde edilen sonuçlar aşağıdaki gibidir:
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.
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.
O zaman, SQL Serverda 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.
Öncelikle bu işlemi gerçekleştirmek için SQL Server .NET CLR Integration yöntemini kullanarak SQL Serverda olmayan bir fonksiyonu C# kodu ile geliştirip SQL Servera 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
1USE master
2GO
3
4sp_configure 'clr enabled', 1
5GO
6
7RECONFIGURE
8GO
2GO
3
4sp_configure 'clr enabled', 1
5GO
6
7RECONFIGURE
8GO
- UTC Time Değrini Local Time Değerine Dönüştüren C# Kodu Yazılmalı
Bir sonraki aşamada açılan sayfadaki kodların tamamını silip aşağıdaki kod bloğunu sayfamıza ekliyoruz:
01using System;
02
03using System.Data;
04
05using System.Data.SqlClient;
06
07using System.Data.SqlTypes;
08
09using Microsoft.SqlServer.Server;
10
11public partial class UserDefinedFunctions
12
13{
14
15[Microsoft.SqlServer.Server.SqlFunction]
16
17public static SqlDateTime ConvertToLocalTime(SqlDateTime utcTime)
18
19{
20
21if (utcTime.IsNull)
22
23return utcTime;
24
25else
26
27return new SqlDateTime(utcTime.Value.ToLocalTime());
28
29}
30
31};
02
03using System.Data;
04
05using System.Data.SqlClient;
06
07using System.Data.SqlTypes;
08
09using Microsoft.SqlServer.Server;
10
11public partial class UserDefinedFunctions
12
13{
14
15[Microsoft.SqlServer.Server.SqlFunction]
16
17public static SqlDateTime ConvertToLocalTime(SqlDateTime utcTime)
18
19{
20
21if (utcTime.IsNull)
22
23return utcTime;
24
25else
26
27return new SqlDateTime(utcTime.Value.ToLocalTime());
28
29}
30
31};
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.
- Oluşturulan DLL Dosyası SQL Serverın Kullanımına Alınır
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 Assemblyden Oluşturulur
1USE AdventureWorks2012
2GO
3
4CREATE FUNCTION ConvertToLocalTime
5(@UTCTime datetime)
6RETURNS DATETIME
7AS
8EXTERNAL NAME [UTCTimeConversion].[UserDefinedFunctions].[ConvertToLocalTime]
2GO
3
4CREATE FUNCTION ConvertToLocalTime
5(@UTCTime datetime)
6RETURNS DATETIME
7AS
8EXTERNAL NAME [UTCTimeConversion].[UserDefinedFunctions].[ConvertToLocalTime]
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.
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.
Aşağıda oluşturulan fonksiyonun çalıştırılması test edilmiştir:
1USE AdventureWorks2012
2GO
3
4SELECT dbo.ConvertToLocalTime('20140322 00:00:00')
5SELECT dbo.ConvertToLocalTime('20120411 00:00:00')
6SELECT dbo.ConvertToLocalTime('20091029 00:00:00')
2GO
3
4SELECT dbo.ConvertToLocalTime('20140322 00:00:00')
5SELECT dbo.ConvertToLocalTime('20120411 00:00:00')
6SELECT dbo.ConvertToLocalTime('20091029 00:00:00')
Elde edilen sonuçlar aşağıdaki gibidir:
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.