SQL Server 2008 R2データベースには、現地時間(SQLサーバーがある時間帯)からUTCに変換する必要があるいくつかの列があります。SQL Server:UTCとローカル時刻を正確に変換する
私はStackOverflowについてよく似た質問を見ましたが、回答はすべて夏時間で正しく機能しないため、現在の差異だけを考慮して日付をオフセットします。
SQL Server 2008 R2データベースには、現地時間(SQLサーバーがある時間帯)からUTCに変換する必要があるいくつかの列があります。SQL Server:UTCとローカル時刻を正確に変換する
私はStackOverflowについてよく似た質問を見ましたが、回答はすべて夏時間で正しく機能しないため、現在の差異だけを考慮して日付をオフセットします。
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時間にしてから変換するには、このような努力に行くことを余儀なくされるように恥です。
これらの関数は、ローカル時刻がのと解釈します。混乱を避けるため、クライアントとサーバーを同じタイムゾーンに設定することをお勧めします。
ありがとうございます。私の場合、2回以上行う必要はありませんでした。ローカル時間が使用されていたデータベースへのアップグレードの一部であり、アップグレードを行うスタンドアロンアプリケーションを作成するだけでした。しかし、私はこれにふさわしいのでこれを答えとして受け入れることに決めました。 – user1450824
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'
DSTを考慮しない:( –
DST移行時(2つのUTC値が1つの現地時間で有効な場合がある)からの時間を処理する必要がありますか? –