この記事には、日付の変換の例が含まれています datetime2の値 SQLServerの値。
日付を変換するとき datetime2の値 、値に追加情報が追加されます。これは、 datetime2 が原因です データ型には、日付と時刻の両方の情報が含まれます。 日付 一方、データ型には日付情報のみが含まれます。
datetime2 データ型は基本的に日時の拡張です データ・タイプ。日付範囲が大きく、デフォルトの分数精度が大きく、オプションでユーザー指定の精度があります。
いずれの場合も、変換プロセスはデータ型に関係なくまったく同じです。唯一の違いは、日付の間で利用できる情報の量です。 、日時 およびdatetime2 。
例1-暗黙の変換
日付間の暗黙的な変換の例を次に示します。 およびdatetime2 。
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
結果:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、日付を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します datetime2の値 変数。
日付がわかります 変数には日付情報のみが含まれますが、 datetime2 変数には、日付と時刻の両方の情報が含まれます。
さらに、 datetimeに変換した場合よりも多くの時間情報を取得できます。 データ型。
日付の間で変換する場合 およびdatetime2 デフォルトの精度(7)を使用すると、時間コンポーネントは00:00:00.0000000
に設定されます。 (00:00:00.000
と比較して 日時の場合 )。必要に応じて、精度を下げることができます(以下を参照)。精度を下げると、値を格納するために必要なスペースの量も減らすことができます。
時間コンポーネントがすべてゼロである理由は、日付値に時間情報が含まれていないため、SQL Serverが必要な時間を知る方法がないためです(存在する場合)。
例2–時間を変更する
時刻を指定する必要がある場合(ただし、同じ日付を維持する必要がある場合)は、DATEADD()
を使用できます。 まさにそれを行うための機能。
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2) SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
結果:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
例3– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します 日付間で明示的に変換するステートメント およびdatetime2 。
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetime2) AS 'datetime2';
結果:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
したがって、暗黙の変換と同じ結果が得られます。
次のように時間を調整することもできます:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';
結果:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
例4– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2, @thedate) AS 'datetime2';
結果:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
そして時間を調整する:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';
結果:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
例5–精度
datetime2 データ型を使用すると、精度を指定できます(デフォルトの7まで)。つまり、必要がなければ、7桁全体を使用する必要はありません。
例:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2(2), @thedate) AS 'datetime2(2)', CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';
結果:
+------------+------------------------+--------------------------+ | date | datetime2(2) | datetime2(4) | |------------+------------------------+--------------------------| | 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 | +------------+------------------------+--------------------------+
精度を下げることの利点の1つは、値を格納するために必要なスペースの量も減らすことができることです。特に、3未満の精度の場合は6バイト、精度3または4の場合は7バイト、その他すべての精度には8バイトが必要です。ただし、最初のバイトは精度を格納するために使用されるため、実際の値は、ここに示されているストレージサイズに、精度を格納するための追加の1バイトを加えたものであることに注意してください。