sql >> データベース >  >> RDS >> Sqlserver

SQLServerで日付を別のタイムゾーンに変換する

    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

    1. PostgreSQL列挙型をJPAおよびHibernateでマッピングする方法

    2. トランザクションログ構成の問題

    3. JDBCタイプの方言マッピングなし:2003

    4. 文字列配列を返し、AutoCompleteTextviewで使用します