この記事には、 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