この記事には、 datetime2の変換例が含まれています 時間の値 SQLServerの値。
datetime2を変換する利点の1つ 時間の値 つまり、ストレージサイズを6〜8バイトから3〜5バイトに減らします(各データ型に割り当てられている精度によって異なります)。厳密に言えば、これらのデータ型の精度を格納するために1バイト余分に使用されるため、これらの量に1バイトを追加する必要があります。
明らかに、変換中に日付部分は失われますが、日付部分を保持する必要がある場合は、この変換を行うことはありません。
datetime2を変換するとき 時間の値 、値の時間部分のみがコピーされます。正確な結果は、各タイプに割り当てられている秒の小数部の精度によって異なります。 時間のとき 精度がdatetime2よりも低い 精度、小数秒は時間に合うように切り上げられます 精度。
精度に関しては、どちらのデータ型でも小数点以下0桁から7までのスケールを指定できます。したがって、小数秒を失ったり、結果を切り上げたりすることなく、変換を実行できます。
例1-暗黙の変換
datetime2間の暗黙的な変換の例を次に示します。 および時間 。
DECLARE @thedatetime2 datetime2, @thetime time; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thetime AS 'time';
結果:
+-----------------------------+------------------+ | datetime2 | time | |-----------------------------+------------------| | 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 | +-----------------------------+------------------+
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、 datetime2 を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 時間の値 変数。
この結果について最も明白なことは、時間 値には日付は含まれません。 時間なので、これは予想されることです。 データ型は、日付値ではなく、時刻値を格納するためだけのものです。
また、この例では、両方のデータ型がデフォルトの精度(7のスケール)を使用しています。これは、時間を意味します 値はdatetime2と同じ精度になります 価値。それらがデフォルトの精度を使用していることを私が知っている理由は、それらを宣言するときに分数秒のスケールを指定しなかったためです。
例2–より高い精度に変換する
この例では、時間 変数は、 datetime2に対してより高い精度を使用します 変数。
DECLARE @thedatetime2 datetime2(4), @thetime time(7); SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thetime AS 'time';
結果:
+--------------------------+------------------+ | datetime2 | time | |--------------------------+------------------| | 2025-05-21 10:15:30.1235 | 10:15:30.1235000 | +--------------------------+------------------+
この場合、 datetime2 変数は4のスケールを使用し、時間 変数は7を使用します。
これにより、 datetime2 分数秒を切り上げて、 1235 を取得します 1234 の代わりに 。また、時間に変換すると 、値は3つの後続ゼロで終わります(7のスケールを指定したため)。これは、時間も意味します 値のストレージサイズは5バイト(精度を含めて6)ですが、4のスケールを指定した場合は4バイト(精度を含めて5)です。
例3–低精度に変換
この例では、時間 変数はdatetime2よりも低い精度を使用します 変数。
DECLARE @thedatetime2 datetime2(7), @thetime time(0); SET @thedatetime2 = '2025-05-21 10:15:30.5678912'; SET @thetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thetime AS 'time';
結果:
+-----------------------------+----------+ | datetime2 | time | |-----------------------------+----------| | 2025-05-21 10:15:30.5678912 | 10:15:31 | +-----------------------------+----------+
したがって、この場合は時間 のスケールは0に縮小されます。これは、結果に小数秒が含まれないことを意味します。また、秒はそれに応じて切り上げられます。
時間 datetime2 の9バイトと比較して、valueは4バイトのストレージ(精度を含む)を使用します 値(および時間の6バイトと比較 前の例の値)。
例4– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します datetime2間で明示的に変換するステートメント および時間 。
DECLARE @thedatetime2 datetime2(3); SET @thedatetime2 = '2025-05-21 10:15:30.123'; SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS time(0)) AS 'time(0)';
結果:
+-------------------------+-----------+ | datetime2 | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.123 | 10:15:30 | +-------------------------+-----------+
例5– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thedatetime2 datetime2(3); SET @thedatetime2 = '2025-05-21 10:15:30.123'; SELECT @thedatetime2 AS 'datetime2', CONVERT(time(0), @thedatetime2) AS 'time(0)';
結果:
+-------------------------+-----------+ | datetime2 | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.123 | 10:15:30 | +-------------------------+-----------+