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

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

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

    日時を変換する場合 datetimeoffsetの値 、結果の値は、 datetimeoffsetに割り当てる秒の小数部の精度によって異なります。 、および指定したタイムゾーンオフセット。

    日時 データ型の小数秒部分は最大3桁です。その精度は、.000、.003、または.007秒の増分に丸められます。

    datetimeoffset 一方、データ型では、0から7までの秒の小数部の精度を指定できます。これを指定しない場合は、7(デフォルト)が使用されます。また、タイムゾーンオフセットがあり、元の値のオフセットを保持できます。ただし、日時 タイムゾーンの認識がないため、保持する既存の値はありません。この場合、タイムゾーンオフセットのデフォルトは+00:00です。

    SQLServerには実際にはTODATETIMEOFFSET()があります 関数。日付/時刻の値をdatetimeoffsetに変換するように特別に設計されています。 タイムゾーンオフセットを追加します。ただし、この関数を使用する際に注意すべき微妙な詳細があります。これについては、以下で説明します(例を示します)。

    例1-暗黙の変換

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

    DECLARE 
      @thedatetime datetime, 
      @thedatetimeoffset datetimeoffset(7);
    SET @thedatetime = '2025-05-21 10:15:30.123';
    SET @thedatetimeoffset = @thedatetime;
    SELECT 
      @thedatetime AS 'datetime',
      @thedatetimeoffset AS 'datetimeoffset(7)';
    

    結果:

    +-------------------------+------------------------------------+
    | datetime                | datetimeoffset(7)                  |
    |-------------------------+------------------------------------|
    | 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +00:00 |
    +-------------------------+------------------------------------+
    

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

    datetimeoffset 変数の秒の小数部の精度が高くなり、最終的に 1233333 の小数部になります。 (vs 123 日時の場合 価値)。また、 +00:00 のタイムゾーンオフセットになります。 。

    7秒の精度を使用すると、 datetimeoffset が発生します ストレージに10バイトを使用します(精度を格納するバイトを含めると11バイト)。比較として、日時 8バイトのみを使用します。ただし、 datetimeoffsetの精度を下げることができます 7をより小さな数値に置き換えることによって値を設定します。これは、 datetime2を使用する場合と同じ概念です。 データ・タイプ。これが最終結果にどのように影響するかの例については、SQLServerで「datetime」を「datetime2」に変換するを参照してください。

    例2–丸め

    日時 データ型は、.000、.003、または.007秒の増分に丸められます。明示的に別の値に設定しても丸められます。それがどのように機能するかを知らない場合、これはあなたに多くの混乱を引き起こす可能性があります。 datetime を使用すると、混乱を招く可能性があるだけではありません。 それ自体で、その値を別のデータ型に変換するときに余分な混乱を引き起こす可能性があります。

    これが私の意味を示す例です。

    DECLARE 
      @thedatetime datetime, 
      @thedatetimeoffset datetimeoffset;
    SET @thedatetime = '2025-05-21 10:15:30.125';
    SET @thedatetimeoffset = @thedatetime;
    SELECT 
      @thedatetime AS 'datetime',
      @thedatetimeoffset AS 'datetimeoffset(7)';
    

    結果:

    +-------------------------+------------------------------------+
    | datetime                | datetimeoffset(7)                  |
    |-------------------------+------------------------------------|
    | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
    +-------------------------+------------------------------------+
    

    この例では、小数秒を125に設定しました。 ただし、日時 127 に切り上げました (このデータ型は、.000、.003、または.007秒の増分にのみ丸めることができるため)。

    datetimeoffset 一方、値は、小数秒を 1266667 に設定します 。

    ただし、初期値を datetimeoffsetに設定するだけの場合 そもそも、その小数部分は 1250000 を返していたでしょう。 。

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

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

    DECLARE @thedatetime datetime;
    SET @thedatetime = '2025-05-21 10:15:30.125';
    SELECT 
      @thedatetime AS 'datetime',
      CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';
    

    結果:

    +-------------------------+------------------------------------+
    | datetime                | datetimeoffset(7)                  |
    |-------------------------+------------------------------------|
    | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
    +-------------------------+------------------------------------+
    

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

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

    DECLARE @thedatetime datetime;
    SET @thedatetime = '2025-05-21 10:15:30.125';
    SELECT 
      @thedatetime AS 'datetime',
      CONVERT(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';
    

    結果:

    +-------------------------+------------------------------------+
    | datetime                | datetimeoffset(7)                  |
    |-------------------------+------------------------------------|
    | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
    +-------------------------+------------------------------------+
    

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

    日時を変換するのに苦労している場合 datetimeoffsetの値 、おそらくタイムゾーンオフセットが必要です。また、+00:00以外に設定する可能性が高くなります。

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

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

    次に例を示します:

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

    結果:

    +-------------------------+------------------------------------+
    | datetime                | datetimeoffset(7)                  |
    |-------------------------+------------------------------------|
    | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
    +-------------------------+------------------------------------+
    

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

    DECLARE @thedatetime datetime = '2025-05-21 10:15:30.125';
    SELECT 
      @thedatetime AS 'datetime',
      TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';
    

    結果:

    +-------------------------+------------------------------------+
    | datetime                | datetimeoffset(7)                  |
    |-------------------------+------------------------------------|
    | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
    +-------------------------+------------------------------------+
    

    TODATETIMEOFFSET()に関する重要なポイント 関数は、渡された日付/時刻引数と同じ分数精度を使用することです。この場合は日時です 引数なので、スケールは3(つまり、3秒未満)です。これはあなたにとって問題かもしれないし、そうでないかもしれません。そうである場合は、いつでも datetimeoffsetに変換できます。 まず、変換された値をTODATETIMEOFFSET()に渡します 。

    例:

    DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);
    SET @thedatetime = '2025-05-21 10:15:30.125';
    SET @thedatetimeoffset = @thedatetime;
    SELECT 
      @thedatetime AS 'datetime',
      @thedatetimeoffset AS 'datetimeoffset',
      TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';
    

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

    datetime       | 2025-05-21 10:15:30.127
    datetimeoffset | 2025-05-21 10:15:30.1266667 +00:00
    Modified       | 2025-05-21 10:15:30.1266667 +07:00
    

    1. イミディエイトウィンドウの高速でダーティなForループ

    2. SQLServerインデックスの断片化情報をプロアクティブに収集する方法

    3. Oracleにレコードが存在するかどうかを確認する最も効率的な方法は何ですか?

    4. MariaDBでのIFNULL()のしくみ