AT TIME ZONE
日付をdatetimeoffsetに変換するために、SQLServer2016で句が導入されました。 ターゲットタイムゾーンの値。
この関数は、SWITCHOFFSET()
などの他のT-SQL関数に似ています。 およびTODATETIMEOFFSET()
ただし、AT TIME ZONE
句を使用すると、実際のオフセット値ではなく、名前でタイムゾーンオフセットを指定できます/(必須)。
この記事では、AT TIME ZONE
動作し、言及された他の機能と比較した場合の利点を説明します。
使用例
AT TIME ZONE
の基本的な例を次に示します。 条項は機能します。
DECLARE @dto datetimeoffset = '2020-04-01 00:00:00.0000000 +00:00';
SELECT
@dto AS [Original],
@dto AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time];
結果(垂直出力を使用):
Original | 2020-04-01 00:00:00.0000000 +00:00 NZ Time | 2020-04-01 13:00:00.0000000 +13:00
SWITCHOFFSET()
を使用できたのに、なぜMicrosoftがこの機能を導入したのか不思議に思うかもしれません。 同じことをする機能はありますか?
ええと、できません 実際には、SWITCHOFFSET()
でまったく同じことを行います 。
SWITCHOFFSET()
を使用 、実際のタイムゾーンオフセットは、[+ |-] TZH:TZMの形式で、または符号付き整数(分単位)として指定する必要があります。これは、正確なタイムゾーンオフセット、およびを知る必要があることを意味します そのタイムゾーンが現在夏時間を採用しているかどうか。
AT TIME ZONE
を使用 条項、あなたはそれを知る必要はありません。知っておく必要があるのは、タイムゾーンの名前だけです(タイムゾーンの名前を取得する方法は次のとおりです)。
夏時間の例
AT TIME ZONE
を使用するメリットを示す例を次に示します。 夏時間に関して。
DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
@dto1 AS [@dto1],
@dto2 AS [@dto2],
@dto1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto1],
@dto2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dto2];
結果(垂直出力を使用):
@dto1 | 2020-04-01 00:00:00.0000000 +00:00 @dto2 | 2020-04-07 00:00:00.0000000 +00:00 NZ Time: @dto1 | 2020-04-01 13:00:00.0000000 +13:00 NZ Time: @dto2 | 2020-04-07 12:00:00.0000000 +12:00
ニュージーランドでは、夏時間調整は2020年3月5日に終了します。したがって、この例では2つの日付(3月1日と3月7日)を使用します。
それらを「ニュージーランド標準時間」に変換すると、AT TIME ZONE
計算に夏時間が自動的に含まれ、該当する日付/時刻が返されます。
したがって、3月1日の日付は+13:00のタイムゾーンオフセットを使用し、3月7日の日付は+12:00を使用していることがわかります(夏時間が3月5日に終了したため)。
SWITCHOFFSET()
を使用した場合 各日付に使用するタイムゾーンオフセットを知っている必要がありました。
DECLARE @dto1 datetimeoffset, @dto2 datetimeoffset;
SET @dto1 = '2020-04-01 00:00:00.0000000 +00:00';
SET @dto2 = '2020-04-07 00:00:00.0000000 +00:00';
SELECT
@dto1 AS [@dto1],
@dto2 AS [@dto2],
SWITCHOFFSET(@dto1, '+12:00') AS [+12:00],
SWITCHOFFSET(@dto2, '+13:00') AS [+13:00];
結果(垂直出力を使用):
@dto1 | 2020-04-01 00:00:00.0000000 +00:00 @dto2 | 2020-04-07 00:00:00.0000000 +00:00 +12:00 | 2020-04-01 12:00:00.0000000 +12:00 +13:00 | 2020-04-07 13:00:00.0000000 +13:00
タイムゾーンオフセットのない日付からの変換
AT TIME ZONE
を使用することもできます タイムゾーンオフセットのない日付。実際、この関数は、 smalldatetimeに解決できるすべての式を受け入れます。 、日時 、 datetime2 、または datetimeoffset 値。
ただし、これを行うときは、結果の計算方法に注意する必要があります。日付がオフセット情報なしで提供される場合、関数は、入力された日付がターゲットのタイムゾーンにあると想定して、タイムゾーンのオフセットを適用します。
DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
@dt1 AS [@dt1],
@dt2 AS [@dt2],
@dt1 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
@dt2 AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];
結果:
@dt1 | 2020-04-01 00:00:00 @dt2 | 2020-04-07 00:00:00 NZ Time: @dt1 | 2020-04-01 00:00:00.0000000 +13:00 NZ Time: @dt2 | 2020-04-07 00:00:00.0000000 +12:00
タイムゾーンオフセットは指定どおりに適用されましたが、これは日付/時刻には影響しなかったことに注意してください。結果の日付/時刻は両方とも同じ値になります–タイムゾーンオフセットのみが変更されます。
これが希望どおりでない場合は、AT TIME ZONE 'UTC'
を追加できます。 目的のタイムゾーンに変換される前に、最初に元の日付をUTCに変換するためにミックスに追加します。
DECLARE @dt1 smalldatetime, @dt2 smalldatetime;
SET @dt1 = '2020-04-01 00:00:00';
SET @dt2 = '2020-04-07 00:00:00';
SELECT
@dt1 AS [@dt1],
@dt2 AS [@dt2],
@dt1 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt1],
@dt2 AT TIME ZONE 'UTC' AT TIME ZONE 'New Zealand Standard Time' AS [NZ Time: @dt2];
結果:
@dt1 | 2020-04-01 00:00:00 @dt2 | 2020-04-07 00:00:00 NZ Time: @dt1 | 2020-04-01 13:00:00.0000000 +13:00 NZ Time: @dt2 | 2020-04-07 12:00:00.0000000 +12:00