この記事には、 datetimeoffsetの変換例が含まれています datetime2の値 SQLServerで。
datetimeoffsetを変換するとき datetime2の値 、日付と時刻が datetime2にコピーされます 値であり、タイムゾーンは切り捨てられます。宛先の精度が低い場合は、小数秒も切り捨てられて収まります。
datetimeoffset データ型では、datetimeoffset(n)
を使用して、0から7までの秒の小数部の精度を指定できます。 構文。これを指定しない場合は、7(デフォルト)が使用されます。タイムゾーンオフセットもあります。このデータ型のストレージサイズは、使用されている精度に応じて、8、9、または10バイトのいずれかです。
datetime2 データ型では、0から7までの秒の小数部の精度を指定することもできます(datetime2(n)
を使用) 構文)。タイムゾーンの認識はありません。そのストレージサイズは、使用されている精度に応じて、6、7、または8のいずれかになります。
ここに記載されているストレージ量は、Microsoftのドキュメントに記載されている量であることに注意してください。ただし、これらのデータ型も1バイトを使用して精度を格納します。したがって、ストレージ要件のより完全な全体像を把握するには、ここにリストされている量に1バイトを追加してください。
例1-暗黙の変換
これは、 datetimeoffset間の暗黙的な変換の例です。 およびdatetime2 。
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime2 datetime2; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SET @thedatetime2 = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';
結果:
+------------------------------------+-----------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-----------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 | +------------------------------------+-----------------------------+
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、 datetimeoffset を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 datetime2の値 変数。
この例では、両方のデータ型がデフォルトの精度(小数点以下7桁)を使用しています。したがって、小数部分は 1234567 でした。 両方の結果について。
また、タイムゾーンオフセットが切り捨てられていることもわかります– datetime2 データ型にはタイムゾーン認識がありません。
この変換では、ストレージサイズが10バイトから減少しました( datetimeoffset の場合) )から8バイト( datetime2 の場合) )、ただし、精度を格納するために1バイトが追加されることに注意してください。
例2–異なる精度
これは、 datetime2の場合に何が起こるかを示す例です。 値は、 datetimeoffsetよりも低い精度を使用します 値。
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SET @thedatetime2 = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';
結果:
+------------------------------------+-------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+
この例では、 datetimeoffset スケールは7
しかし、 datetime2 値のスケールは3
だけです 。したがって、小数秒は収まるように切り捨てられました。
これにより、丸めが発生する可能性があることに注意してください。これは、 datetime2の小数部分の例です。 値は 124 に切り上げられます 。
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +07:00'; SET @thedatetime2 = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';
結果:
+------------------------------------+-------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 | +------------------------------------+-------------------------+
例3– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します datetimeoffset間で明示的に変換するステートメント およびdatetime2 。
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime2) AS 'datetime2';
結果:
+------------------------------------+-----------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-----------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 | +------------------------------------+-----------------------------+
例4– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime2, @thedatetimeoffset) AS 'datetime2';
結果:
+------------------------------------+-----------------------------+ | datetimeoffset | datetime2 | |------------------------------------+-----------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 | +------------------------------------+-----------------------------+