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