2012-06-16 4 views
5

SQL Server 2008 R2データベースには、現地時間(SQLサーバーがある時間帯)からUTCに変換する必要があるいくつかの列があります。SQL Server:UTCとローカル時刻を正確に変換する

私はStackOverflowについてよく似た質問を見ましたが、回答はすべて夏時間で正しく機能しないため、現在の差異だけを考慮して日付をオフセットします。

+0

DST移行時(2つのUTC値が1つの現地時間で有効な場合がある)からの時間を処理する必要がありますか? –

答えて

7

T-SQLだけでこれを行う方法はありませんでした。私は、SQL CLRを使用して、それを解く:

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(); 
    } 
} 

そして、次の登録スクリプト:

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; 

それはUTC時間にしてから変換するには、このような努力に行くことを余儀なくされるように恥です。

これらの関数は、ローカル時刻がのと解釈します。混乱を避けるため、クライアントとサーバーを同じタイムゾーンに設定することをお勧めします。

+1

ありがとうございます。私の場合、2回以上行う必要はありませんでした。ローカル時間が使用されていたデータベースへのアップグレードの一部であり、アップグレードを行うスタンドアロンアプリケーションを作成するだけでした。しかし、私はこれにふさわしいのでこれを答えとして受け入れることに決めました。 – 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を考慮しない:( –

関連する問題