Birçok ülkede, gün ışığı tasarrufu amacı ile saatler, belli tarihlerde ileri veya geri alınıyor. Projelerde, ileri-geri alma işlemleri önemli olduğunda veya farklı zaman dilimindeki ülkelere ait tarih değerlerinin bir referans etrafında birbirine göre gerçek zamanını kıyaslamak gerektiğinde dünya üstünde tanımlı saat dilimlerinden faydalanılır. SQL Server 2005 veya 2008'de herhangi bir tarih için kolayca yerel zamana dönüşüm veya yerel zamandan UTC 0 gibi bir zaman koordinatina dönüşüm yapmak istiyorsanız CLR temelli kendi fonksiyonunuzu kodlayabilirsiniz.
SQL Server 2005’in global zaman desteği yok denecek kadar az. 2008 sürümünün bu alandaki yenilikleri için bkz.T-SQL Yenilikleri-2
Herhangi bir anda SQL Server’ın hangi saat diliminde çalıştığını anlamak oldukça basit: GETDATE() fonksiyonu SQL Server’ın üstünde kurulu olduğu sisteme ait zamanı verirken, GETUTCDATE() fonksiyonu da o anda UTC çizgisindeki zamanı vermekte. Haliyle o anda bu iki değer arasındaki farktan SQL Server’ın üstünde çalıştığı sunucunun hangi saat diliminde olduğunu anlamak mümkün.
Fakat bir çok global zaman dönüşümünde anlık bulunan bu değer anlamsızdır. Çünkü sunucu bazen +3 zaman bölgesinde iken(örneğin tr-yaz saati), daha sonraki gün +2 saat dilimine geçmiş olabilir. Bu tür geçiş anlarında GETUTCDATE() ve GETDATE() farkı ile elde edilen saat dilimi bilgisi anlamını yitirecektir.
İşte bu tür bir durumla baş etmek için kullanılabilecek C# kodları ve ilgili T-SQL ifadeleri.
DİKKAT:Bu ifadeler SQL Server 2005 ve 2008 sürümlerinde kullanılabilir.
İlgili C# Kodları
using System;
using System.Collections.Generic;
using System.Text;
public class LocalTime
{
public static DateTime ToLocalTime(DateTime tarih)
{
DateTime yeniTarih = new DateTime(tarih.Ticks, DateTimeKind.Utc);
return yeniTarih.ToLocalTime();
}
}
Bu kodları CSharp Compiler ile bir dll’e derlemeniz gerekir. Derlenmiş halini indirebilirsiniz.
Visual Studio kurulu değilse SQL Server 2005’e yüklemek etmek için çalıştırılması gereken kodlar
CREATE ASSEMBLY Localizer
FROM 'C:\Temp\ToLocalTime.dll'
SQL Server 2005’de gerekli fonksiyon uç biriminin kodlanması
CREATE FUNCTION LocalTime(
@tarih DATETIME
)
RETURNS DATETIME
AS
EXTERNAL NAME Localizer.[LocalTime].ToLocalTime
GO
Şayet SQL Server CLR izni açık değilse ilgili ayarlamaların yapılması
sp_configure 'clr enabled',1
RECONFIGURE
GO
Yerel Saat dönüşümünün Test Edilmesi
SELECT dbo.LocalTime('2009-03-20 08:35:26.000')