この記事には、日付の変換の例が含まれています smalldatetimeの値 SQLServerの値。
日付を変換するとき smalldatetimeの値 、値に追加情報が追加されます。これは、 smalldatetime が原因です データ型には、日付と時刻の両方の情報が含まれます。 日付 一方、データ型には日付情報のみが含まれます。
ただし、日付の場合があります smalldatetime 変換が失敗する可能性があります。特に、日付 値がsmalldatetimeでサポートされている範囲外です その後、エラーで失敗します。
いずれにせよ、以下はこれら2つのデータ型間の変換の例です。
例1-暗黙の変換
日付間の暗黙的な変換の例を次に示します。 およびsmalldatetime 。
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
結果:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+>
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、日付を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します smalldatetimeの値 変数。
日付がわかります 変数には日付情報のみが含まれますが、 smalldatetime 変数には、日付と時刻の両方の情報が含まれます。
日付の間で変換する場合 およびsmalldatetime 、時間コンポーネントは00:00:00
に設定されます 。これにより、分単位の精度が得られます。
すべてゼロである理由は、日付値に時刻情報が含まれていないため、SQL Serverが必要な時刻(存在する場合)を知る方法がないためです。
もちろん、単に日付のみの値を smalldatetime に割り当てた場合でも、この結果が得られます。 変換を実行せずに:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01' SELECT @thesmalldatetime AS 'smalldatetime';
結果:
+---------------------+ | smalldatetime | |---------------------| | 2020-12-01 00:00:00 | +---------------------+
例2–時間を変更する
時刻を指定する必要がある場合(ただし、同じ日付を維持する必要がある場合)は、DATEADD()
を使用できます。 まさにそれを行うための機能。
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime) SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
結果:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+>
例3– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します 日付間で明示的に変換するステートメント およびsmalldatetime 。
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
結果:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+>
暗黙の変換と同じ結果。
次のように時間を調整することもできます:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
結果:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+>
例4– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
結果:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+>
そして時間を調整する:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
結果:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+>
例5–範囲外エラー
前述のように、日付が smalldatetimeでサポートされている範囲外の場合 データ型の場合、エラーが発生します。
DECLARE @thedate date SET @thedate = '2080-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
結果:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
smalldatetime データ型は、1900-01-01から2079-06-06までの日付範囲のみをサポートします。
また、 smalldatetime データ型は00:00:00から23:59:59までの時間範囲のみをサポートしているため、その範囲外の値を使用しようとすると(たとえば、より高い精度で)エラーが発生します。
例:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
結果:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
ただし、この場合、変換中のエラーではなく、実際にはDATEADD()
の使用中のエラーです。 関数(この関数では、特定の日付部分を smalldatetimeで使用することはできません。 データ型)。