この記事には、 datetimeoffsetの変換例が含まれています 日時の値 SQLServerで。
datetimeoffsetを変換するとき 日時の値 、日付と時刻の値がコピーされ、タイムゾーンオフセットが切り捨てられます。 datetimeoffsetの分数精度の場合 値が3桁より大きい場合、値は切り捨てられます。
datetimeoffset データ型では、0から7までの秒の小数部の精度を指定できます。これは、datetimeoffset(n)
を使用して行われます。 構文。これを指定しない場合は、7(デフォルト)が使用されます。タイムゾーンオフセットもあります。このデータ型のストレージサイズは、使用されている精度に応じて、8、9、または10バイトのいずれかです。精度を格納するために別のバイトが使用されるため、これらの数値に1バイトが追加されます。
日時 一方、データ型の小数秒部分は最大3桁です。その精度は、.000、.003、または.007秒の増分に丸められます。このデータ型にはタイムゾーンの認識がないため、タイムゾーンのオフセットはありません。そのストレージサイズは8バイトです。
例1-暗黙の変換
datetimeoffset間の暗黙的な変換の例を次に示します。 および日時 。
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SET @thedatetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
結果:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、 datetimeoffset を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 日時の値 変数。
日時がわかります 変数の秒の小数部の精度は低く、 123 の小数部になります。 元の小数部分は 1234567 でしたが 。
この場合、丸めは実行されませんでした。
また、タイムゾーンオフセットが切り捨てられていることもわかります。 日時 データ型にはタイムゾーン認識がありません。
この変換では、 datetimeoffset のストレージサイズが10バイト(精度を格納する追加のバイトを含めると11バイト)から減少しました。 、日時の場合は8バイト 。ただし、 datetimeoffset 値は0から2の間のスケールを使用していましたが、8バイト(精度を含めて9バイト)しか使用していませんでした。
スケール3(日時に相当)を使用した場合 値)、ストレージサイズは9バイト(精度では10バイト)になります。ただし、その精度は日時よりも高かったでしょう。 。もちろん、日時に変換するとすぐに精度が低下します 。
例2–精度/精度と丸め
日時 データ型は、.000、.003、または.007秒の増分に丸められます。明示的に別の値に設定しても丸められます。
これは、別のデータ型(ここで行っていることなど)から変換する場合にも当てはまります。
これが私の意味を示す例です。
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.1250000 +07:00'; SET @thedatetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
結果:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 | +------------------------------------+-------------------------+
この例では、 datetimeoffsetの秒の小数部を設定します 1250000
への値 ただし、日時
127
に切り上げました (.000、.003、または.007秒の増分にのみ丸めることができるため)。
例3– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します datetimeoffset間で明示的に変換するステートメント および日時 。
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime) AS 'datetime';
結果:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+
例4– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime, @thedatetimeoffset) AS 'datetime';
結果:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+