2012-06-16 27 views
5

Yerel saatten (sql sunucusunun bulunduğu saat dilimi) UTC'ye dönüştürmem gereken bir SQL Server 2008 R2 veritabanında birkaç sütun var.SQL Server: UTC ve Yerel Saat Arasında Tam Olarak Dönüştürme

StackOverflow hakkında birkaç benzer soru gördüm, ancak yanıtların tümü gün ışığından yararlanma saati ile doğru şekilde çalışmaz, yalnızca mevcut farkı dikkate alır ve tarihi dengelemektedir.

+0

DST geçişleri sırasında (iki UTC değeri tek bir yerel saat için geçerli bir sonuç olduğunda) zamanla uğraşmanız mı gerekiyor? –

cevap

7

Bunu tek başına T-SQL kullanarak hiçbir şekilde bulamadık.

public static class DateTimeFunctions 
{ 
    [SqlFunction(IsDeterministic = true, IsPrecise = true)] 
    public static DateTime? ToLocalTime(DateTime? dateTime) 
    { 
     if (dateTime == null) return null; 
     return dateTime.Value.ToLocalTime(); 
    } 

    [SqlFunction(IsDeterministic = true, IsPrecise = true)] 
    public static DateTime? ToUniversalTime(DateTime? dateTime) 
    { 
     if (dateTime == null) return null; 
     return dateTime.Value.ToUniversalTime(); 
    } 
} 

Ve aşağıdaki kayıt komut:

CREATE FUNCTION ToLocalTime(@dateTime DATETIME2) RETURNS DATETIME2 AS EXTERNAL NAME AssemblyName.[AssemblyName.DateTimeFunctions].ToLocalTime; 
GO 
CREATE FUNCTION ToUniversalTime(@dateTime DATETIME2) RETURNS DATETIME2 AS EXTERNAL NAME AssemblyName.[AssemblyName.DateTimeFunctions].ToUniversalTime; 

O ve UTC zaman dönüştürmek için böyle bir çaba gitmek zorunda olmak utanç verici SQL CLR kullanarak çözdü.

Bu işlevlerin, yerel olarak sunucuya göre yerel saatini olarak yorumladığını unutmayın. Herhangi bir karışıklığı önlemek için istemcilerin ve sunucuların aynı saat dilimine ayarlanması önerilir.

+1

Girişiniz için teşekkür ederiz. Benim durumumda, bir kereden fazla yapmam gereken bir şey değildi, yerel zamanın kullanıldığı veritabanına yükseltmenin bir parçasıydı ve sadece yükseltme yapmak için bağımsız bir uygulama oluşturdum. Ama bunu bir cevap olarak kabul ettim, çünkü bunu hak ediyor. – user1450824

1
DECLARE @convertedUTC datetime, @convertedLocal datetime 
    SELECT DATEADD(
        HOUR,         -- Add a number of hours equal to 
        DateDiff(HOUR, GETDATE(), GETUTCDATE()), -- the difference of UTC-MyTime 
        GetDate()        -- to MyTime 
        ) 

    SELECT @convertedUTC = DATEADD(HOUR,DateDiff(HOUR, GETDATE(), GETUTCDATE()),GetDate()) --Assign the above to a var 

    SELECT DATEADD(
        HOUR,         -- Add a number of hours equal to 
        DateDiff(HOUR, GETUTCDATE(),GETDATE()), -- the difference of MyTime-UTC 
        @convertedUTC       -- to MyTime 
        ) 

    SELECT @convertedLocal = DATEADD(HOUR,DateDiff(HOUR, GETUTCDATE(),GETDATE()),GetDate()) --Assign the above to a var 


    /* Do our converted dates match the real dates? */ 
    DECLARE @realUTC datetime = (SELECT GETUTCDATE()) 
    DECLARE @realLocal datetime = (SELECT GetDate()) 

    SELECT 'REAL:', @realUTC AS 'UTC', @realLocal AS 'Local' 
    UNION 
    SELECT 'CONVERTED:', @convertedUTC AS 'UTC', @convertedLocal AS 'Local' 
+1

DST :(için hesap vermiyor –

İlgili konular