datetime2を変換するユースケースはおそらくほとんどありません。 日時の値 SQLServerで。特に、 datetime2 datetimeと同じストレージサイズを使用するようにデータ型を設定できます 、ただし、より高い精度で。したがって、ほとんどの場合、 datetime2を使用したほうがよいでしょう。 日時よりも 。 datetime2の使用もお勧めします 日時の代わりに 。
ただし、この変換を実行する必要がある状況に陥った場合に備えて、この記事には、役立つ可能性のあるいくつかの例と考慮事項が含まれています。
datetime2を変換するとき 日時の値 、結果の値は、 datetime2に割り当てられた小数秒によって異なります。 値とその精度。
datetime2 データ型では、0から7までの秒の小数部の精度を指定できます。これを指定しない場合は、7(デフォルト)が使用されます。
日時 一方、データ型は、小数秒の部分で最大3桁です。その精度は、.000、.003、または.007秒の増分に丸められます。
したがって、 datetime2 スケール3を使用すると、結果の値は元の値に非常に近くなります(同一でない場合)。ただし、日時の精度が低いため 、実行する丸めのため、結果が異なる場合があります。
例1-暗黙の変換
datetime2間の暗黙的な変換の例を次に示します。 および日時 。
DECLARE @thedatetime2 datetime2, @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
結果:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 | +-----------------------------+-------------------------+
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、 datetime2 を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 日時の値 変数。
日時がわかります 変数の秒の小数部の精度は低く、 123 の小数部になります。 元の小数部分は 1234567 でしたが 。
この場合、丸めは実行されませんでした。
例2–精度/精度と丸め
日時 データ型は、.000、.003、または.007秒の増分に丸められます。明示的に別の値に設定しても丸められます。
これは、別のデータ型(ここで行っていることなど)から変換する場合にも当てはまります。
これが私の意味を示す例です。
DECLARE @thedatetime2 datetime2, @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1256789'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
結果:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 | +-----------------------------+-------------------------+
この例では、 datetime2の秒の小数部を設定します 1256789
への値 ただし、日時
127
に切り上げました (.000、.003、または.007秒の増分にのみ丸めることができるため)。
datetime2 にわずか3秒しか割り当てない場合でも、これは引き続き当てはまることに注意してください。 価値。
例:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.125'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
結果:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
また、元の datetime2に発生する可能性のある丸めに注意することも重要です。 価値。 datetime2 独自のスケールよりも秒数が多い値を割り当てようとすると、値自体が切り上げられる可能性があります。
例:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.1256789'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
結果:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
この場合、 1256789 の小数部分で値を割り当てようとします 。ただし、 datetime2(3) 値のスケールは3のみで、小数点以下3桁しかサポートできません。この場合、最後の桁は切り上げられます(次の桁が5以上であるため)。
両方のdatetime2(3) および日時 同じ量のストレージスペース(8バイト)を使用します。 datetime2(3) データ型は実際にはデータを格納するために7バイトを使用しますが、精度を格納するために追加の1バイトを使用します。
例3– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します datetime2間で明示的に変換するステートメント および日時 。
DECLARE @thedatetime2 datetime2; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS datetime) AS 'datetime';
結果:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 | +-----------------------------+-------------------------+
例4– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thedatetime2 datetime2; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SELECT @thedatetime2 AS 'datetime2', CONVERT(datetime, @thedatetime2) AS 'datetime';
結果:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 | +-----------------------------+-------------------------+