この記事では、日時の主な違いについて説明します およびsmalldatetime SQLServerのデータ型。
両方のデータ型は日付と時刻の値を格納するために使用されますが、2つの間に違いがあります。ほとんどの場合、両方のタイプを避け、 datetime2を使用することをお勧めします 代わりに(Microsoftもこれを推奨しています)。いずれにせよ、これら2つのデータ型の比較を次に示します。
次の表に、これら2つのデータ型の主な類似点と相違点の概要を示します。
機能 | smalldatetime | 日時 |
---|---|---|
SQL準拠(ANSIおよびISO 8601) | いいえ | いいえ |
日付範囲 | 1900-01-01から2079-06-06 | 1753-01-01から9999-12-31 |
時間範囲 | 00:00:00から23:59:59 | 00:00:00から23:59:59.997 |
文字の長さ | 最大19ポジション | 最小19ポジション 最大23ポジション |
ストレージサイズ | 4バイト、固定 | 8バイト、固定 |
精度 | 1分 | .000、.003、または.007秒の増分に丸められます |
フラクショナルセカンドプレシジョン | いいえ | はい |
ユーザー定義の分数秒精度 | いいえ | いいえ |
タイムゾーンオフセット | なし | なし |
タイムゾーンオフセットの認識と保存 | いいえ | いいえ |
夏時間対応 | いいえ | いいえ |
「datetime」と「smalldatetime」のどちらを使用する必要がありますか?
Microsoftは、これらのデータ型の両方を新しい作業に使用しないことをお勧めします。強い理由がある場合にのみ使用してください。
ただし、選択する必要がある場合は、日時の追加の精度と精度を比較検討して決定する可能性があります。 対smalldatetimeの低いストレージ要件 。
つまり、秒の精度が必要ない場合は、 smalldatetime ストレージスペースの半分だけを使用しながら仕事をします。一方、秒(または数分の1秒)の精度が必要な場合は、日時を使用する必要があります。 。
いずれの場合も、Microsoftは日付を使用することをお勧めします 、時間 、 datetime2 、または datetimeoffset 新しい仕事のために。
smalldatetimeを参照してください vs datetime2 および日時 vs datetime2 これらの各タイプがdatetime2とどのように比較されるかを確認します 。
例1-基本的な比較
日時の基本的な違いを示す簡単な例を次に示します。 およびsmalldatetime 。
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
結果:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
ここでは、 smalldatetimeを設定します 日時と同じ値に変数 変数。これにより、値が smalldatetimeに変換されます その後、SELECT
を使用できます 各変数に割り当てられた実際の値を確認するステートメント。
この場合、両方の変数が値を切り上げます。ただし、切り上げは異なります。
日時 変数は、小数秒の部分を切り上げます。これは、日時が原因です 常に.000、.003、または.007秒の増分に丸められます。
smalldatetime 一方、変数は、分を切り上げます 部。それだけでなく、秒の部分はゼロに設定されます。 Microsoftの公式ドキュメントには、smalldatetime
と記載されているため、これは予想されることです。 の時間は…24時間ベースで、秒は常にゼロ(:00)で、小数秒はありません
。
つまり、日時 タイプは、より正確で正確な日付/時刻の値を提供します。
例2–文字列リテラルからの値の設定
前の例では、 smalldateime 値は、日時と同じ値に設定することで割り当てられました 価値。これを行うと、SQL Serverは、データが新しいデータ型に「適合する」ために暗黙的な変換を実行します。
結局のところ、 smalldatetimeを設定することもできます 分数秒を含む同じ文字列リテラルへの変数(このデータ型は小数秒を格納しませんが)。
これが私がまさにそれを行う例です:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = '2025-05-21 10:15:30.555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
結果:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
もちろん、値を選択しても結果は同じです– smalldatetime 値には小数秒は表示されず、秒はゼロで、分は切り上げられます。
ただし、小数点以下3桁を超える場合は、両方のデータ型でエラーが返されます。
日時のエラー :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
結果:
Msg 241, Level 16, State 1, Line 4 Conversion failed when converting date and/or time from character string.
smalldatetimeのエラー :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
結果:
Msg 295, Level 16, State 3, Line 5 Conversion failed when converting character string to smalldatetime data type.
例3–ストレージサイズ
smalldatetime データ型のストレージサイズは4バイトに固定されています。これは、 smalldatetimeの数少ないメリットの1つです。 日時を超えています 、8バイトの固定ストレージサイズがあります。
DATALENGTH()
を使用してストレージサイズを確認できます 各値に使用されたバイト数を返す関数:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(@thedatetime) AS 'datetime', DATALENGTH(@thesmalldatetime) AS 'smalldatetime';
結果
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+
varbinary に変換しても、同じ結果が得られます。 、これは、データベースに実際にどのように保存されているかをよりよく表しています。
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(CAST(@thedatetime AS varbinary(10))) AS 'datetime', DATALENGTH(CAST(@thesmalldatetime AS varbinary(10))) AS 'smalldatetime';
結果
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+