この記事には、 smalldatetimeを変換する例が含まれています 時間の値 SQLServerの値。
smalldatetimeを変換するとき 時間の値 、あなたは日付を失います。時間、分、秒がコピーされます。分数秒は0に設定されます。
smalldatetime データ型には、日付と時刻の両方が含まれます。ただし、時間には小数秒はなく、秒のコンポーネントは常にゼロ(:00)に設定されます。その精度は分単位です。そのストレージサイズは4バイトです。
時間 一方、データ型には時間のみが含まれます。ただし、0から7までの秒の小数部の精度を指定できます。これは、 time( n )を使用して実現されます。 ) 構文、ここで n は0から7までのスケールです。これを指定しない場合、7(デフォルト)が使用され、100ナノ秒の精度が提供されます。ゼロを指定した場合(0
)、その精度は最も近い秒になります。そのストレージサイズは、小数秒の精度に応じて、3、4、または5バイト(および精度を格納するための1バイト)のいずれかになります。
例1-暗黙の変換
これは、日時間の暗黙的な変換の例です。 および時間 。
DECLARE @thesmalldatetime smalldatetime, @thetime time; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'time';
結果:
+---------------------+----------+ | smalldatetime | time | |---------------------+----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+----------+
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、 smalldatetime を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 時間の値 変数。
この結果で最も明白なことは、時間 値には日付は含まれません。 時間なので、これは予想されることです。 データ型は、日付値ではなく、時刻値を格納するためだけのものです。
ではないこと (少なくとも私の例では)明らかなのは、時間の値が実際に秒の小数部を処理できることです。私のシステムはここに秒の小数部を表示しませんが、次の例は、実際には秒の小数部の精度が7であることを示しています。
また、よく見ると、 smalldatetime 値は、私が割り当てようとしていた実際の値から分を切り上げました。これは、 smalldatetimeの精度が比較的低いことを反映しています。 データ・タイプ。その精度は分単位です。これの明らかな結果は、最終的にその値を時間に再割り当てしたときです。 データ型。割り当てられるのは切り上げられた値であり、割り当てようとした初期値ではありません。初期値を時間に直接割り当てた場合 変数の場合、より正確な値が得られます(0のスケールを指定した場合でも)。
意味は次のとおりです:
DECLARE @thesmalldatetime smalldatetime, @thetime time(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'time';
結果:
+---------------------+----------+ | smalldatetime | time | |---------------------+----------| | 2025-05-21 10:16:00 | 10:15:30 | +---------------------+----------+
例2–小数秒の追加
smalldatetime データ型には秒の小数部はありませんが、最初の例では、時間 値の秒の精度は7です(実際には小数点以下の桁数は表示されませんが)。宣言時にスケールを指定しなかったため、精度がわかります。したがって、デフォルトのスケールである7を使用します。
時間を確認する例を次に示します。 実際、値は小数部分をサポートできます:
DECLARE @thesmalldatetime smalldatetime, @thetime time; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'Original time', DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';
結果:
+---------------------+-----------------+------------------+ | smalldatetime | Original time | Modified time | |---------------------+-----------------+------------------| | 2025-05-21 10:16:00 | 10:16:00 | 10:16:00.1234567 | +---------------------+-----------------+------------------+
時間のときは注意してください 値のスケールは7で、ストレージサイズは5バイトです。したがって、 smalldatetimeよりも高いストレージ要件があります タイプ(4バイトのみを使用)。
例3– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します smalldatetime間で明示的に変換するステートメント および時間 。
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CAST(@thesmalldatetime AS time(0)) AS 'time(0)';
結果:
+---------------------+-----------+ | smalldatetime | time(0) | |---------------------+-----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+-----------+
この例では、スケールを0に設定しました。
例4– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CONVERT(time(0), @thesmalldatetime) AS 'time(0)';
結果:
+---------------------+-----------+ | smalldatetime | time(0) | |---------------------+-----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+-----------+