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

SQL Serverで「datetime2」を「datetimeoffset」に変換します(T-SQLの例)

    この記事には、 datetime2の変換例が含まれています datetimeoffsetの値 SQLServerの値。

    datetime2を変換するとき datetimeoffsetの値 、結果の値は、各データ型に割り当てられている秒の小数部の精度と、指定したタイムゾーンオフセットによって異なります。

    どちらのデータ型でも、0から7までの秒の小数部の精度を指定できます。これを指定しない場合、デフォルトのスケールである7が使用されます。

    datetimeoffset データ型にはタイムゾーンオフセットが含まれ、元の値のオフセットを保持できます。ただし、 datetime2 タイムゾーンの認識がないため、保持する既存の値はありません。この場合、タイムゾーンオフセットのデフォルトは+00:00です。

    TODATETIMEOFFSET() 関数は、日付/時刻の値を datetimeoffsetに変換するように特別に設計されています タイムゾーンオフセットを追加します。ただし、このオプションに関する以下の私のコメント(および例)を参照してください。

    例1-暗黙の変換

    まず、 datetime2間の暗黙的な変換の例を次に示します。 およびdatetimeoffset

    DECLARE 
      @thedatetime2 datetime2(7), 
      @thedatetimeoffset datetimeoffset(7);
    SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
    SET @thedatetimeoffset = @thedatetime2;
    SELECT 
      @thedatetime2 AS 'datetime2',
      @thedatetimeoffset AS 'datetimeoffset(7)';
    

    結果:

    +-----------------------------+------------------------------------+
    | datetime2                   | datetimeoffset(7)                  |
    |-----------------------------+------------------------------------|
    | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
    +-----------------------------+------------------------------------+
    

    明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、 datetime2 を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 datetimeoffsetの値 変数。

    datetimeoffset 変数は、 datetime2と同じ精度を使用できます 値(小数点以下7桁)。また、 +00:00 のタイムゾーンオフセットになります。 。

    7秒の精度を使用すると、 datetimeoffset が発生します ストレージに11バイトを使用します(データに10バイト、精度に1バイト)。 datetime2 タイプは、7のスケールを使用する場合、9バイト(データ用に8バイト、精度用に1バイト)を使用します。

    ただし、7を小さい数値に置き換えると、精度を下げることができます。

    例2–丸め

    datetimeoffsetの場合 datetime2よりも精度が低くなります 値、切り上げられます。

    次に例を示します:

    DECLARE 
      @thedatetime2 datetime2(7), 
      @thedatetimeoffset datetimeoffset(6);
    SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
    SET @thedatetimeoffset = @thedatetime2;
    SELECT 
      @thedatetime2 AS 'datetime2(7)',
      @thedatetimeoffset AS 'datetimeoffset(6)';
    

    結果:

    +-----------------------------+------------------------------------+
    | datetime2(7)                | datetimeoffset(6)                  |
    |-----------------------------+------------------------------------|
    | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
    +-----------------------------+------------------------------------+
    

    この例では、 datetime2 値のスケールは7ですが、 datetimeoffset 値のスケールはわずか6です。したがって、その精度は小数点以下6桁までであり、6桁目は(6ではなく)7に切り上げられます。

    例3– CAST()を使用した明示的な変換

    明示的な変換の例を次に示します。この場合、私はCAST()を使用します SELECT内で直接機能します datetime2間で明示的に変換するステートメント およびdatetimeoffset

    DECLARE @thedatetime2 datetime2;
    SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
    SELECT 
      @thedatetime2 AS 'datetime2',
      CAST(@thedatetime2 AS datetimeoffset) AS 'datetimeoffset';
    

    結果:

    +-----------------------------+------------------------------------+
    | datetime2                   | datetimeoffset                     |
    |-----------------------------+------------------------------------|
    | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
    +-----------------------------+------------------------------------+
    

    例4– CONVERT()を使用した明示的な変換

    CONVERT()を使用した明示的な変換の例を次に示します。 CAST()の代わりに関数 。

    DECLARE @thedatetime2 datetime2;
    SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
    SELECT 
      @thedatetime2 AS 'datetime2',
      CONVERT(datetimeoffset, @thedatetime2) AS 'datetimeoffset';
    

    結果:

    +-----------------------------+------------------------------------+
    | datetime2                   | datetimeoffset                     |
    |-----------------------------+------------------------------------|
    | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
    +-----------------------------+------------------------------------+
    

    例5–タイムゾーンオフセットの変更

    datetime2から変換する場合 datetimeoffset 、おそらくタイムゾーンオフセットのためにそれを行っています。また、デフォルトの+00:00以外の値が必要になる可能性も高くなります。

    幸い、TODATETIMEOFFSET()を使用できます オフセットを変更する関数。

    この関数を使用して、元の datetime2を変換することもできます datetimeoffsetの値 価値。この関数は、 datetime2に解決できるすべての日付/時刻値を受け入れます 値、およびオフセット値。

    次に例を示します:

    DECLARE @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset;
    SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
    SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime2, '+07:00');
    SELECT 
      @thedatetime2 AS 'datetime2',
      @thedatetimeoffset AS 'datetimeoffset';
    

    結果:

    +-----------------------------+------------------------------------+
    | datetime2                   | datetimeoffset                     |
    |-----------------------------+------------------------------------|
    | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
    +-----------------------------+------------------------------------+
    

    SELECT内の関数を使用した例を次に示します。 ステートメント:

    DECLARE @thedatetime2 datetime2 = '2025-05-21 10:15:30.1234567';
    SELECT 
      @thedatetime2 AS 'datetime2',
      TODATETIMEOFFSET(@thedatetime2, '+07:00') AS 'datetimeoffset';
    

    結果:

    +-----------------------------+------------------------------------+
    | datetime2                   | datetimeoffset                     |
    |-----------------------------+------------------------------------|
    | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
    +-----------------------------+------------------------------------+
    

    TODATETIMEOFFSET()に関する重要なポイント 関数は、渡された日付/時刻引数と同じ分数精度を使用することです。

    したがって、 datetime2 datetimeoffsetよりも低い精度を使用します 、いつでもより高い精度で変数に再割り当てし、その変換された値をTODATETIMEOFFSET()に渡すことができます。 。

    例:

    DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
    SET @lowprecision = '2025-05-21 10:15:30.123';
    SET @highprecision = @lowprecision;
    SELECT 
      @lowprecision AS 'lowprecision',
      @highprecision AS 'highprecision',
      TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';
    

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

    lowprecision  | 2025-05-21 10:15:30.123
    highprecision | 2025-05-21 10:15:30.1230000
    Modified      | 2025-05-21 10:15:30.1230000 +07:00
    

    1. 時間のない日付のみを知ってテーブルから選択する(ORACLE)

    2. PostgreSQL 12:K最近傍空間で分割された一般化された検索ツリーインデックスの実装

    3. SQLで一意の制約を削除するにはどうすればよいですか?

    4. Access2016でAccessデータベースをSQLServerにリンクする方法