SQL ServerでSELECT文中に記述するUTC時刻をローカルタイムに変換する方法
SQL ServerでSELECT文中に記述するUTC時刻をローカルタイムに変換する方法
SQL Serverで保存されているUTC時刻を、SELECT文を実行するクライアントのローカルタイムに変換したい場合、いくつかの方法があります。
方法
- AT TIME ZONE関数
SELECT
col1,
col2,
col3,
col4 AT TIME ZONE local AS LocalTime
FROM
YourTable;
この方法は、AT TIME ZONE
関数を用いて、UTC時刻をローカルタイムに変換します。local
は、クライアントのローカルタイムゾーンを表します。
例
SELECT
col1,
col2,
col3,
col4 AT TIME ZONE 'Asia/Tokyo' AS LocalTime
FROM
YourTable;
この例では、col4
列のUTC時刻を、日本時間(JST)に変換します。
- DATEADD関数
SELECT
col1,
col2,
col3,
DATEADD(MINUTE, DATEDIFF(MINUTE, 'UTC', GETUTCDATE()), col4) AS LocalTime
FROM
YourTable;
この方法は、DATEADD
関数とDATEDIFF
関数、GETUTCDATE
関数を組み合わせて、UTC時刻をローカルタイムに変換します。
SELECT
col1,
col2,
col3,
DATEADD(MINUTE, DATEDIFF(MINUTE, 'UTC', GETUTCDATE()), col4) AS LocalTime
FROM
YourTable;
この例では、col4
列のUTC時刻に、クライアントとUTCの時差を加算して、ローカルタイムに変換します。
- CASE式
SELECT
col1,
col2,
col3,
CASE
WHEN @@SERVERNAME LIKE '%JPN%' THEN DATEADD(HOUR, 9, col4)
ELSE DATEADD(HOUR, 8, col4)
END AS LocalTime
FROM
YourTable;
この方法は、CASE
式を用いて、サーバーの場所に基づいてローカルタイムを判断します。
SELECT
col1,
col2,
col3,
CASE
WHEN @@SERVERNAME LIKE '%JPN%' THEN DATEADD(HOUR, 9, col4)
ELSE DATEADD(HOUR, 8, col4)
END AS LocalTime
FROM
YourTable;
この例では、サーバー名がJPN
を含む場合、col4
列のUTC時刻に9時間加算して日本時間に変換します。そうでない場合は、8時間加算して中国標準時(CST)に変換します。
注意点
- 上記の方法は、SQL Server 2008以降で使用できます。
- クライアントのローカルタイムゾーンは、OSの設定によって異なります。
- 複数のタイムゾーンに対応する場合は、
sys.time_zone_info
テーブルを参照する必要があります。
CREATE TABLE YourTable (
col1 INT,
col2 VARCHAR(50),
col3 DATETIME,
col4 DATETIME2
);
データ挿入
INSERT INTO YourTable (col1, col2, col3, col4)
VALUES
(1, 'Test1', '2024-03-26 00:00:00.000', '2024-03-26 00:00:00.000'),
(2, 'Test2', '2024-03-26 12:00:00.000', '2024-03-26 12:00:00.000');
SELECT文
SELECT
col1,
col2,
col3,
col4 AT TIME ZONE local AS LocalTime
FROM
YourTable;
結果
col1 | col2 | col3 | LocalTime
------- | -------- | -------- | --------
1 | Test1 | 2024-03-26 00:00:00.000 | 2024-03-26 09:00:00.000
2 | Test2 | 2024-03-26 12:00:00.000 | 2024-03-26 21:00:00.000
解説
- このサンプルコードは、
AT TIME ZONE
関数を使用して、UTC時刻をローカルタイムに変換しています。 local
は、クライアントのローカルタイムゾーンを表します。- 結果では、
col4
列のUTC時刻が、クライアントのローカルタイムに変換されて表示されています。
補足
- 上記のサンプルコードは、日本時間(JST)を想定して記述されています。
- 他のタイムゾーンに変換する場合は、
local
パラメータをそのタイムゾーンの名前に変更する必要があります。
SELECT
col1,
col2,
col3,
DATEADD(MINUTE, DATEDIFF(MINUTE, 'UTC', GETUTCDATE()), col4) AS LocalTime
FROM
YourTable;
- サーバーの場所に基づいてローカルタイムを判断する場合は、
CASE
式を使用できます。
SELECT
col1,
col2,
col3,
CASE
WHEN @@SERVERNAME LIKE '%JPN%' THEN DATEADD(HOUR, 9, col4)
ELSE DATEADD(HOUR, 8, col4)
END AS LocalTime
FROM
YourTable;
.NET Framework
- C#などの.NET Framework言語を使用する場合は、
DateTime
クラスのToLocalTime()
メソッドを使用して、UTC時刻をローカルタイムに変換できます。
var utcTime = DateTime.UtcNow;
var localTime = utcTime.ToLocalTime();
ライブラリ
- Moment.jsなどのライブラリを使用して、UTC時刻をローカルタイムに変換できます。
var utcTime = moment.utc();
var localTime = utcTime.local();
- 上記の方法は、それぞれ異なる利点と欠点があります。
- 処理速度が重要な場合は、T-SQL関数を使用するのが効率的です。
- 開発環境に.NET FrameworkまたはMoment.jsが導入済みの場合は、これらのライブラリを使用するのが便利です。
注意事項
- UTC時刻とローカルタイムの差は、タイムゾーンによって異なります。
sql sql-server