datetimeoffsetがある場合 値ですが、日付とタイムゾーンのオフセット部分は必要ありません。時間に変換します。 (値から不要な詳細を削除しながら)多くのストレージスペースを節約します。この記事には、 datetimeoffsetの変換例が含まれています 時間の値 SQLServerの値。
datetimeoffset データ型には、タイムゾーンオフセットのある日付と時刻が含まれます。また、0から7までの秒の部分があります(これは、割り当てられている秒の数によって異なります)。これは、datetimeoffset(n)
を使用して行われます。 構文。これを指定しない場合は、7(デフォルト)が使用されます。このデータ型のストレージサイズは、使用されている精度に応じて、8、9、または10バイトのいずれかです。その精度は100ナノ秒です。
時間 一方、データ型には時間のみが含まれます。日付は含まれず、タイムゾーンオフセットも含まれません。ただし、 datetimeoffsetと同様です また、(time(n)
を使用して、0〜7の秒の小数部を指定することもできます。 構文)。精度に応じて、3、4、または5バイトのいずれかを使用します。
datetimeoffsetを変換するとき 時間の値 データ型の場合、日付部分が失われます。また、タイムゾーンオフセットも失われます。ただし、ストレージサイズを8〜10バイトから3、4、または5バイトに減らします。ただし、この変換は、日付部分またはタイムゾーンオフセットが必要ない場合にのみ行います。
ここに記載されているストレージ量は、Microsoftのドキュメントに記載されている量であることに注意してください。ただし、これらのデータ型も1バイトを使用して精度を格納します。したがって、ここにリストされている金額に1バイトを追加する必要があります。
例1-暗黙の変換
datetimeoffset間の暗黙的な変換の例を次に示します。 および時間 。
DECLARE @thedatetimeoffset datetimeoffset, @thetime time; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
結果:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、 datetimeoffset を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 時間の値 変数。
ここで、時間がわかります 値には時間のみが含まれます(日付コンポーネントは含まれません)。日付とタイムゾーンのオフセットコンポーネントが値から削除されました。
この例では、両方のデータ型がデフォルトの精度を使用しています(小数点以下7桁になります)。これにより、 datetimeoffsetが発生します 10バイトと時間を使用した値 5バイトを使用した値。
例2–精度
正確な結果は、各データ型の精度設定によって異なります。次の例では、時間 値は、元の datetimeoffsetよりも低い精度を使用します 値:
DECLARE @thedatetimeoffset datetimeoffset(7), @thetime time(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
結果:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 | +------------------------------------+------------------+
私のシステムは末尾のゼロを表示しますが、要点は時間 値の精度は、元の値が使用する小数点以下7桁と比較して、小数点以下3桁になりました。
精度を下げると、時間になる可能性もあります 値は切り上げられます。次に例を示します:
DECLARE @thedatetimeoffset datetimeoffset(7), @thetime time(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
結果:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 | +------------------------------------+------------------+
この場合、 124 の小数部分になります。 123 の代わりに 、次の桁が5以上だったため。
例3– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します datetimeoffset間で明示的に変換するステートメント および時間 。
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS time) AS 'time';
結果:
+------------------------------------+------------------+ | datetimeoffset | date | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+
例4– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(time, @thedatetimeoffset) AS 'time';
結果:
+------------------------------------+------------------+ | datetimeoffset | date | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+