SQL Server 2008 R2 データベースに、現地時間 (SQL サーバーのタイム ゾーン) から UTC に変換する必要がある列がいくつかあります。
私は StackOverflow でかなりの数の同様の質問を見てきましたが、回答はすべて夏時間で正しく機能しません。現在の違いのみを考慮し、日付をオフセットします。
SQL Server 2008 R2 データベースに、現地時間 (SQL サーバーのタイム ゾーン) から UTC に変換する必要がある列がいくつかあります。
私は StackOverflow でかなりの数の同様の質問を見てきましたが、回答はすべて夏時間で正しく機能しません。現在の違いのみを考慮し、日付をオフセットします。
T-SQLだけを使用してこれを行う方法はまったく見つかりませんでした。SQLCLRを使用して解決しました。
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時間との間で変換するためにそのような努力を強いられるのは残念です。
これらの関数は、ローカル時間をサーバーに対してローカルであるものとして解釈することに注意してください。混乱を避けるために、クライアントとサーバーを同じタイムゾーンに設定することをお勧めします。
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'