この記事には、SQL Serverで日付値をsmalldatetime値に変換する例が記載されています。
日付値をsmalldatetimeに変換すると、その値に余分な情報が追加されます。 これは、smalldatetime データ型に日付と時刻の両方の情報が含まれるためです。 一方、日付データ型は日付情報のみを含んでいます。
しかし、日付からsmalldatetimeへの変換が失敗する場合があります。 特に、日付の値がsmalldatetimeでサポートされる範囲外である場合、エラーで失敗します。
いずれにしても、以下にこれら 2 つのデータ型間の変換の例を示します。
Example 1 – Implicit Conversion
ここに、日付と smalldatetime 間の暗黙の変換の例を示します。
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Result:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
これは、変換関数(以下のようなもの)を使用して明示的に変換していないため、暗黙的な変換と言えます。 この場合、SQL Server は、日付値を smalldatetime 変数に代入しようとすると、舞台裏で暗黙の変換を実行します。
日付変数には日付情報しか含まれていないのに対し、smalldatetime 変数には日付と時間の両方の情報が含まれていることがわかります。
dateとsmalldatetimeの間で変換するとき、timeコンポーネントは00:00:00
に設定されます。 これは、分単位の精度を提供します。
すべてゼロである理由は、日付値には時間情報が含まれていないため、SQL Server が希望する時間を知る方法がないためです (ある場合)。
もちろん、変換を行わずに日付のみの値を単に smalldatetime に代入した場合でも、この結果が得られます。
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Result:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
例3 – CAST()
を使用した明示的な変換
ここで、明示的に変換する例を紹介します。 この場合、SELECT
ステートメント内で直接 CAST()
関数を使用して、日付と smalldatetime の間を明示的に変換しています。
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Result:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
暗黙の変換と同じ結果です。
このように時間を調整することもできます。
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Result:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
例 4 – CONVERT()
ここで、CAST()
の代わりにCONVERT()
関数を使用して明示的に変換する例について説明します。
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Result:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
そして時間を調整する:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Result:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
例5 – Out of Range Error
前述のように、日付が smalldatetime データ型がサポートする範囲の外にある場合、エラーが表示されます。
DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Result:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
The smalldatetime data type only supports date ranges 1900-01-01 through 2079-06-06.
また、smalldatetime データ型は時間範囲 00:00:00 から 23:59:59 までしかサポートしていないため、その範囲外の値 (たとえば、より高い精度) を使用しようとすると、エラーも表示されます。
例:
DECLARE @thedate dateSET @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 データ型に特定の日付部分を使用できないため)。
…