この記事には、時間の変換の例が含まれています datetime2の値 SQLServerの値。
時間を変換するとき datetime2の値 、値に追加情報が追加されます。これは、 datetime2 が原因です データ型には、日付と時刻の両方の情報が含まれます。 時間 一方、データ型には時間情報のみが含まれます。
より具体的には、日付は「1900-01-01」に設定され(「1900-01-02」に切り上げられない限り)、時間コンポーネントがコピーされ、Microsoftのドキュメントによると、タイムゾーンオフセット00:00に設定されています( datetime2 であっても) データ型はタイムゾーンを認識せず、タイムゾーンオフセットを保持しません)。
datetime2(n)の秒の小数部の精度の場合 値がtime(n)より大きい 値、値は切り上げられます。
例1-CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します 時間から明示的に変換するステートメント datetime2 。
DECLARE @thetime time; SET @thetime = '23:15:59.004007'; SELECT @thetime AS 'time', CAST(@thetime AS datetime2) AS 'datetime2';
結果:
+------------------+-----------------------------+ | time | datetime2 | |------------------+-----------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 | +------------------+-----------------------------+
時間から変換する場合 datetime2 、日付コンポーネントが追加され、1900-01-01
に設定されます 。
ただし、日付が1900-01-02
に切り上げられるシナリオがあります。 。これは、秒の小数部と使用する精度によって異なります。この例については、以下を参照してください。
例2–分数秒の精度
各データ型に割り当てられている秒の小数部の精度に応じて、異なる結果を得ることができます。これは、小数部の実際の値によって異なります。
前の例では、両方のデータ型が同じ小数秒の精度を使用していました。これは、(精度を定義するために)スケールを指定しなかったため、両方ともデフォルトのスケール値(両方とも7)を使用したためです。
明確にするために、スケール 数値の小数点の右側の桁数です。 精度 は数値の合計桁数です。
とにかく、その例では、初期値に小数点以下6桁しか割り当てていないため、最後にゼロが追加されます。
時間に高い精度を指定するとどうなりますか datetime2と比較した値 値:
DECLARE @thetime time(7); SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS datetime2(4)) AS 'datetime2(4)';
結果:
+------------------+--------------------------+ | time | datetime2(4) | |------------------+--------------------------| | 23:15:59.1234567 | 1900-01-01 23:15:59.1235 | +------------------+--------------------------+
datetime2に4のスケールを指定する 値の場合、結果は小数点以下4桁に減らされ、この場合は切り上げられます。
ご想像のとおり、切り上げられるのは小数部分だけではありません。小数部分によって分と秒が切り上げられる例を次に示します。
DECLARE @thetime time(7); SET @thetime = '23:15:59.7654321'; SELECT @thetime AS 'time', CAST(@thetime AS datetime2(0)) AS 'datetime2(0)';
結果:
+------------------+---------------------+ | time | datetime2(0) | |------------------+---------------------| | 23:15:59.7654321 | 1900-01-01 23:16:00 | +------------------+---------------------+
ただし、精度を変更することで、同じデータに対して異なる結果を得ることができます。小数点以下1桁でも精度を上げると、次のようになります。
DECLARE @thetime time(7); SET @thetime = '23:15:59.7654321'; SELECT @thetime AS 'time', CAST(@thetime AS datetime2(1)) AS 'datetime2(1)';
結果:
+------------------+-----------------------+ | time | datetime2(1) | |------------------+-----------------------| | 23:15:59.7654321 | 1900-01-01 23:15:59.8 | +------------------+-----------------------+
したがって、この場合、分と秒はありません。 切り上げられます(ただし、ミリ秒は 。
時刻を設定するとどうなりますか datetime2よりも低い精度のスケールを使用する値 価値。
DECLARE @thetime time(0); SET @thetime = '23:15:59.004007'; SELECT @thetime AS 'time', CAST(@thetime AS datetime2) AS 'datetime2';
結果:
+----------+-----------------------------+ | time | datetime2 | |----------+-----------------------------| | 23:15:59 | 1900-01-01 23:15:59.0000000 | +----------+-----------------------------+
そして、私たちがそれに取り組んでいる間、これは私たちの精密なスケールが分数秒をもたらし、日付が翌日に丸められる可能性がある例です:
DECLARE @thetime time(7); SET @thetime = '23:59:59.9999999'; SELECT @thetime AS 'time', CAST(@thetime AS datetime2(0)) AS 'datetime2(0)';
結果:
+------------------+---------------------+ | time | datetime2(0) | |------------------+---------------------| | 23:59:59.9999999 | 1900-01-02 00:00:00 | +------------------+---------------------+
例3– CONVERT()を使用した明示的な変換
これは最初の例と同じですが、今回はCONVERT()
を使用します。 CAST()
の代わりに関数 。
DECLARE @thetime time; SET @thetime = '23:15:59.004007'; SELECT @thetime AS 'time', CONVERT(datetime2, @thetime) AS 'datetime2';
結果:
+------------------+-----------------------------+ | time | datetime2 | |------------------+-----------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 | +------------------+-----------------------------+
例4–暗黙の変換
これは同じことを行う例ですが、暗黙的な型変換を使用しています。
DECLARE @thetime time, @thedatetime2 datetime2; SET @thetime = '23:15:59.004007'; SET @thedatetime2 = @thetime; SELECT @thetime AS 'time', @thedatetime2 AS 'datetime2';
結果:
+------------------+-----------------------------+ | time | datetime2 | |------------------+-----------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 | +------------------+-----------------------------+
したがって、明示的な変換であるか暗黙的な変換であるかに関係なく、同じ結果が得られます。
明示的に変換するために変換関数を使用していないため、これは暗黙的な変換です。あるデータ型の変数から別のデータ型の変数に値を割り当てるだけです。この場合、時間を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 datetime2の値 変数。
例5–日付を変更する
日付を変更する必要がある場合(ただし、同じ時刻を維持する必要がある場合)は、DATEADD()
を使用できます。 働き。
DECLARE @thetime time, @thedatetime2 datetime2; SET @thetime = '23:15:59.004007'; SET @thedatetime2 = @thetime; SET @thedatetime2 = DATEADD(year, 120, @thedatetime2); SELECT @thetime AS 'time', @thedatetime2 AS 'datetime2';
結果:
+------------------+-----------------------------+ | time | datetime2 | |------------------+-----------------------------| | 23:15:59.0040070 | 2020-01-01 23:15:59.0040070 | +------------------+-----------------------------+
この場合、年の値に120を追加すると、2020年になります。