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

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

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

    smalldatetimeを変換するとき datetimeoffsetの値 、 smalldatetime 値はdatetimeoffsetにコピーされます 価値。分数秒は0に設定され、タイムゾーンオフセットは+ 00:0に設定されます。

    smalldatetime データ型には小数秒がなく、その秒コンポーネントは常にゼロ(:00)に設定されます。その精度は最も近い分です。

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

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

    例1-暗黙の変換

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

    DECLARE 
      @thesmalldatetime smalldatetime, 
      @thedatetimeoffset datetimeoffset(7);
    SET @thesmalldatetime = '2025-05-21 10:15:30';
    SET @thedatetimeoffset = @thesmalldatetime;
    SELECT 
      @thesmalldatetime AS 'smalldatetime',
      @thedatetimeoffset AS 'datetimeoffset(7)';
    

    結果:

    +---------------------+------------------------------------+
    | smalldatetime       | datetimeoffset(7)                  |
    |---------------------+------------------------------------|
    | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
    +---------------------+------------------------------------+
    

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

    datetimeoffset 変数には小数部分があります( 00000000 )、一方、 smalldatetime 値には小数部分がなく、初期値を割り当てるときにその分が切り上げられました。 datetimeoffset 値には、 +00:00 のタイムゾーンオフセットも含まれます 。

    7秒の精度を使用すると、 datetimeoffset が発生します ストレージに11バイトを使用します(データの保存に10バイト、精度に1バイト)。それに比べて、 smalldatetime 4バイトのみを使用します。ただし、 datetimeoffsetの精度を下げることができます 7をより小さな数値に置き換えることによって値を設定します。分数秒の部分を完全に削除する場合は、datetimeoffset(0)を使用するだけです。 。これを行うと、ストレージサイズが9バイトに減少します(精度の1を含む)。

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

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

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

    結果:

    +---------------------+------------------------------------+
    | smalldatetime       | datetimeoffset(7)                  |
    |---------------------+------------------------------------|
    | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
    +---------------------+------------------------------------+
    

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

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

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

    結果:

    +---------------------+------------------------------------+
    | smalldatetime       | datetimeoffset(7)                  |
    |---------------------+------------------------------------|
    | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
    +---------------------+------------------------------------+
    

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

    smalldatetimeを変換しているという事実 datetimeoffsetの値 おそらくタイムゾーンオフセットでそれを行っていることを意味します。また、+ 00:00(デフォルトのオフセット)とは異なるオフセットに設定する必要がある可能性があります。

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

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

    次に例を示します:

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

    結果:

    +---------------------+------------------------------------+
    | smalldatetime       | datetimeoffset                     |
    |---------------------+------------------------------------|
    | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
    +---------------------+------------------------------------+
    

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

    DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30';
    SELECT 
      @thesmalldatetime AS 'smalldatetime',
      TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';
    

    結果:

    +---------------------+------------------------------------+
    | smalldatetime       | datetimeoffset                     |
    |---------------------+------------------------------------|
    | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
    +---------------------+------------------------------------+
    

    TODATETIMEOFFSET()に関する重要なポイント 関数は、渡された日付/時刻引数と同じ分数精度を使用することです。この場合、それは smalldatetime です 引数。小数秒はありません。

    私のシステムはdatetimeoffsetで末尾のゼロを返します ただし、小数部分は次のように表示される場合があります。

    +---------------------+----------------------------+
    | smalldatetime       | datetimeoffset             |
    |---------------------+----------------------------|
    | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 |
    +---------------------+----------------------------+
    

    どちらの方法でも、 datetimeoffsetを最大限に活用できます。 後で値を変更する必要がある場合のデータ型の精度。

    DATEADD()を使用する例を次に示します。 変換がすでに行われた後、小数秒を変更する関数。

    DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);
    SET @thesmalldatetime = '2025-05-21 10:15:30';
    SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
    SELECT 
      @thesmalldatetime AS 'smalldatetime',
      @thedatetimeoffset AS 'datetimeoffset',
      DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';
    

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

    smalldatetime  | 2025-05-21 10:16:00
    datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00
    Modified       | 2025-05-21 10:16:00.1234567 +07:00
    

    1. .frmファイルからmysqlデータベースを復元します

    2. Oracleテーブルの内容をファイルにエクスポートするにはどうすればよいですか?

    3. 2020年の5つの珍しいMicrosoftAccessのヒント

    4. EF6-並列クエリを正しく実行する方法