この記事には、時間の変換の例が含まれています 日時の値 SQLServerの値。
時間を変換するとき 日時の値 、値に追加情報が追加されます。これは、日時が原因です データ型には、日付と時刻の両方の情報が含まれます。 時間 一方、データ型には時間情報のみが含まれます。したがって、このような変換を実行すると、日付情報が値に追加されます。具体的には、日付は「1900-01-01」に設定されています。
例1-CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します 時間から明示的に変換するステートメント 日時へ 。
DECLARE @thetime time SET @thetime = '23:15:59.004007' SELECT @thetime AS 'time', CAST(@thetime AS datetime) AS 'datetime';
結果:
+------------------+-------------------------+ | time | datetime | |------------------+-------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.003 | +------------------+-------------------------+
時間から変換する場合 日時へ 、日付コンポーネントは1900-01-01
に設定されます 。
また、時間値自体は、これらのデータ型の両方で異なって表示されることに注意してください。 時間 データ型は末尾にゼロを追加します(精度が高いため、デフォルトのスケールは7です)。一方、日時 値は低いスケールを使用し、.000、.003、または.007秒の増分に丸められます。これに問題がある場合は、 datetime2に変換することを検討してください 代わりは。
例2–低精度/スケール
前の例では、時間 値の秒数の精度は、日時よりも高くなりました。 価値。これは、デフォルトのスケール7を使用しているためです。ただし、必要に応じて、これをより低い値に変更できます。
明確にするために、スケール 数値の小数点の右側の桁数です。 精度 は、数値の合計桁数です。データ型に角かっこで囲まれた数字を追加することで、スケールを指定できます。
時刻を明示的に設定するとどうなりますか 低いを持つ値 日時よりもスケール 価値。
DECLARE @thetime time(0) SET @thetime = '23:15:59.004007' SELECT @thetime AS 'time', CAST(@thetime AS datetime) AS 'datetime';
結果:
+----------+-------------------------+ | time | datetime | |----------+-------------------------| | 23:15:59 | 1900-01-01 23:15:59.000 | +----------+-------------------------+
例3– CONVERT()を使用した明示的な変換
これは最初の例と同じですが、今回はCONVERT()
を使用します。 CAST()
の代わりに関数 。
DECLARE @thetime time SET @thetime = '23:15:59.004007' SELECT @thetime AS 'time', CONVERT(datetime, @thetime) AS 'datetime';
結果:
+------------------+-------------------------+ | time | datetime | |------------------+-------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.003 | +------------------+-------------------------+
例4–暗黙の変換
これは同じことを行う例ですが、暗黙的な型変換を使用しています。
DECLARE @thetime time, @thedatetime datetime SET @thetime = '23:15:59.004007' SET @thedatetime = @thetime SELECT @thetime AS 'time', @thedatetime AS 'datetime';
結果:
+------------------+-------------------------+ | time | datetime | |------------------+-------------------------| | 23:15:59.0040070 | 1900-01-01 23:15:59.003 | +------------------+-------------------------+
したがって、明示的な変換であるか暗黙的な変換であるかに関係なく、同じ結果が得られます。
明示的に変換するために変換関数を使用していないため、これは暗黙的な変換です。あるデータ型の変数から別のデータ型の変数に値を割り当てるだけです。この場合、時間を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 日時の値 変数。
例5–日付を変更する
日付を変更する必要がある場合(ただし、同じ時刻を維持する必要がある場合)は、DATEADD()
を使用できます。 働き。
DECLARE @thetime time, @thedatetime datetime SET @thetime = '23:15:59.004007' SET @thedatetime = @thetime SET @thedatetime = DATEADD(year, 120, @thedatetime) SELECT @thetime AS 'time', @thedatetime AS 'datetime';
結果:
+------------------+-------------------------+ | time | datetime | |------------------+-------------------------| | 23:15:59.0040070 | 2020-01-01 23:15:59.003 | +------------------+-------------------------+
この場合、年の値に120を追加すると、2020年になります。