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

SQL Server(T-SQL)のdatetimeoffset値のタイムゾーンオフセットを変更する

    SWITCHOFFSET()を使用できます datetimeoffsetのタイムゾーンオフセットを変更するSQLServerの関数 値。

    この関数は2つの引数を受け入れます。 datetimeoffset(n) 値(または datetimeoffset(n)に解決できる式 値)、および新しいタイムゾーン。

    実例を示します。

    DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
    SELECT
      @dto AS [Original],
      SWITCHOFFSET(@dto, '+04:00') AS [Modified];

    結果(垂直出力を使用):

    Original | 2020-12-20 17:33:59.8900000 +02:00
    Modified | 2020-12-20 19:33:59.8900000 +04:00

    タイムゾーンオフセットは文字列として指定されることに注意してください。これは私が数時間で提供したためです。

    時間単位で指定する場合、タイムゾーンオフセットは[+ |-] TZH:TZMの形式を使用し、文字列として指定する必要があります(一重引用符で囲みます)。

    タイムゾーンオフセットとして分を使用する

    または、タイムゾーンオフセットを分単位で指定することもできます。これを行うときは、整数として指定する必要があります。

    DECLARE @dto datetimeoffset = '2020-12-20 17:33:59.8900000 +02:00';
    SELECT
      @dto AS [Original],
      SWITCHOFFSET(@dto, 240) AS [Modified];

    結果(垂直出力を使用):

    Original | 2020-12-20 17:33:59.8900000 +02:00
    Modified | 2020-12-20 19:33:59.8900000 +04:00

    データベースの例

    SWITCHOFFSET()の使用例を次に示します。 データベーステーブルの列の値。

    CREATE TABLE Test 
      (
          Col1 datetimeoffset
      ); 
    INSERT INTO Test   
    VALUES ('1967-12-20 17:33:59.8900000 -07:00'); 
    SELECT 
      Col1,
      SWITCHOFFSET(Col1, '-08:00') AS Modified
    FROM Test;

    結果(垂直出力を使用):

    Col1     | 1967-12-20 17:33:59.8900000 -07:00
    Modified | 1967-12-20 16:33:59.8900000 -08:00

    GETDATE()値を使用した場合のパフォーマンス

    Microsoftは、SWITCHOFFSET()を使用することをお勧めします GETDATE()を使用 関数を使用すると、クエリオプティマイザーが日時の正確なカーディナリティ推定値を取得できないため、クエリの実行が遅くなる可能性があります。 価値。

    この問題を解決するには、OPTION (RECOMPILE)を使用します クエリヒント。これにより、クエリオプティマイザーは、次に同じクエリが実行されたときにクエリプランを再コンパイルします。

    タイムゾーンオフセットがわかりませんか?

    使用するタイムゾーンオフセットがわからない場合は、SQLServerでサポートされているタイムゾーンのリストを取得する方法を次に示します。

    注意する必要があることの1つは、夏時間です。多くの国/地域には、夏時間を採用するための独自のルールがあります(一部の地域では、夏時間をまったく採用していません)。これにより、夏時間をタイムゾーンのオフセットに含めるかどうかを検討するときに、さまざまな問題が発生する可能性があります。

    幸い、SQLServerはこれに対処する方法を考え出しました。 SQL Server 2016では、AT TIME ZONEが導入されました 句。この句を使用すると、タイムゾーンオフセット自体ではなく、タイムゾーンの名前を指定できます。したがって、「米国山岳部標準時」または「インド標準時」、あるいは該当する任意のタイムゾーンを使用できます。

    これを行う方法の例については、日付を別のタイムゾーンに変換するを参照してください。


    1. SQLServerリンクサーバーのクエリ例

    2. SQLで外部キーを使用してテーブルを作成する方法

    3. 列ストアプラン

    4. SQLServerで「値をデータ型に変換するときに変換に失敗しました」を修正する方法