この記事には、時間の変換の例が含まれています smalldatetimeの値 SQLServerの値。
時間を変換するとき smalldatetimeの値 、日付は「1900-01-01」に設定され、時間と分の値は切り上げられます。秒と小数秒は0に設定されます。
例1-CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します 時間から明示的に変換するステートメント smalldatetime 。
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
結果:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
そのため、日付部分が追加されて「1900-01-01」に設定されます。この場合、分の値は切り上げられ、秒は0に設定されます。
Microsoftのドキュメントには、小数秒もゼロに設定されていると記載されていますが、 smalldatetime とにかく、データ型には小数秒は含まれていません。
ちなみに、 smalldatetimeを使用するときはいつでも データ型の場合、秒コンポーネントは常に0に設定されます。
例2–時間を切り上げる
切り上げられる時間の例を次に示します。
DECLARE @thetime time(0); SET @thetime = '10:59:59'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
結果:
+----------+---------------------+ | time | smalldatetime | |----------+---------------------| | 10:59:59 | 1900-01-01 11:00:00 | +----------+---------------------+
この場合、時間値に0のスケールも指定しましたが、これは結果に影響しません。
明確にするために、スケール 数値の小数点の右側の桁数です。 精度 は、数値の合計桁数です。スケール0を指定すると、小数部が含まれないことを意味します。
例3– CONVERT()を使用した明示的な変換
CONVERT()
を使用した例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(smalldatetime, @thetime) AS 'smalldatetime';
結果:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
例4–暗黙の変換
これは同じことを行う例ですが、暗黙的な型変換を使用しています。
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
結果:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
したがって、明示的な変換であるか暗黙的な変換であるかに関係なく、同じ結果が得られます。
明示的に変換するために変換関数を使用していないため、これは暗黙的な変換です。あるデータ型の変数から別のデータ型の変数に値を割り当てるだけです。この場合、時間を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 smalldatetimeの値 変数。
例5–日付を変更する
日付を変更する必要がある場合(ただし、同じ時刻を維持する必要がある場合)は、DATEADD()
を使用できます。 働き。
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
結果:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1985-01-01 23:16:00 | +------------------+---------------------+
この場合、年の値に85を追加すると、1985年になります。
ただし、 smalldatetime に注意してください 非常に狭い日付範囲(1900-01-01から2079-06-06)をサポートしているため、年に追加しすぎると、次のようなオーバーフローエラーが発生する可能性があります。
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
結果:
Adding a value to a 'smalldatetime' column caused an overflow.