この記事には、時間の変換の例が含まれています datetimeoffsetの値 Transact-SQLを使用したSQLServerの値。
時間を変換するとき datetimeoffsetの値 、日付は「1900-01-01」に設定され、時刻がコピーされます。タイムゾーンオフセットが追加され、+00:00に設定されます。
例1-CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します 時間から明示的に変換するステートメント datetimeoffset 。
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS datetimeoffset) AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 | +------------------+------------------------------------+
そのため、日付部分が追加されて「1900-01-01」に設定され、時刻がコピーされ、タイムゾーンオフセットが追加されて+00:00に設定されます。
例2–精度
前の例では、両方のデータ型がデフォルトの精度/スケール(7)を使用しています。これは、角かっこで囲まれたスケールを追加しなかったためです(スケールは秒の小数部の精度を決定します)。 7のスケールを使用することにより、両方のデータ型が小数点以下7桁まで正確な時間値を表すことができることがわかります。
つまり、最初に@thetime
を設定したとき 変数、値に小数点以下7桁を含めました(具体的には、1234567
)。 「time」と「datetimeoffset」の両方のデータ型は、どちらも7のスケールを使用しているため、これらを正常に表すことができました。これも、デフォルト値であるため7を使用していることがわかります。
明確にするために、スケール 数値の小数点の右側の桁数です。 精度 は数値の合計桁数です。
必要に応じて、秒の小数部の精度を下げることができます。
データ型が異なる小数秒の精度を使用するように設定されている場合に何が起こるかを示すいくつかの例を次に示します。
DECLARE @thetime time(7); SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS datetimeoffset(0)) AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.1234567 | 1900-01-01 23:15:59.0000000 +00:00 | +------------------+------------------------------------+
この場合、@thetime
を明示的に設定します スケール7を使用する変数。ただし、これを datetimeoffsetにキャストすると 、スケールを0に設定しました。したがって、 datetimeoffsetの結果 値は秒の分数の精度よりも低くなります。私のシステムでは、小数点以下7桁が表示されますが、すべて0です。
ここでも同じですが、今回は datetimeoffsetの秒の小数部の精度を3に上げます。 値:
DECLARE @thetime time(7); SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS datetimeoffset(3)) AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.1234567 | 1900-01-01 23:15:59.1230000 +00:00 | +------------------+------------------------------------+
したがって、最初の3つの分数秒(ミリ秒)を使用します。
ただし、秒の小数部の精度を4に上げると、どうなるか見てみましょう。
DECLARE @thetime time(7); SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS datetimeoffset(4)) AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.1234567 | 1900-01-01 23:15:59.1235000 +00:00 | +------------------+------------------------------------+
次の例では、小数部分の値を増やして、 datetimeoffsetの非小数部分を作成します。 切り上げられる値:
DECLARE @thetime time(7); SET @thetime = '23:15:59.7654321'; SELECT @thetime AS 'time', CAST(@thetime AS datetimeoffset(0)) AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.7654321 | 1900-01-01 23:16:00.0000000 +00:00 | +------------------+------------------------------------+
この場合、分は切り上げられ、秒はゼロに設定されました。
datetimeoffset になるように交換してみましょう 時間よりも精度が高い 値:
DECLARE @thetime time(4); SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS datetimeoffset(7)) AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.1235000 | 1900-01-01 23:15:59.1235000 +00:00 | +------------------+------------------------------------+
@thetime
を宣言しました スケール4を使用する変数ですが、 datetimeoffsetに変換するときにスケール7を使用しました データ・タイプ。すでに割り当てられている精度よりも高い精度を使用することはできないため、7の精度を使用する必要はありません。
また、(より高い精度の) datetimeoffset に変換されるまでに、より低い精度の丸めがすでに発生しています。 データ・タイプ。 時間に注意してください データ型は、割り当てた初期値からの小数秒を切り上げました。この丸め効果は、 datetimeoffsetにも流れました。 値。
例3– CONVERT()を使用した明示的な変換
CONVERT()
を使用した例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(datetimeoffset, @thetime) AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 | +------------------+------------------------------------+
例4–暗黙の変換
これは同じことを行う例ですが、暗黙的な型変換を使用しています。
DECLARE @thetime time, @thedatetimeoffset datetimeoffset; SET @thetime = '23:15:59.1234567'; SET @thedatetimeoffset = @thetime; SELECT @thetime AS 'time', @thedatetimeoffset AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 | +------------------+------------------------------------+
したがって、明示的な変換であるか暗黙的な変換であるかに関係なく、同じ結果が得られます。
明示的に変換するために変換関数を使用していないため、これは暗黙的な変換です。あるデータ型の変数から別のデータ型の変数に値を割り当てるだけです。この場合、時間を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 datetimeoffsetの値 変数。
例5–日付を変更する
日付を変更する必要がある場合(ただし、同じ時刻を維持する必要がある場合)は、DATEADD()
を使用できます。 働き。
DECLARE @thetime time, @thedatetimeoffset datetimeoffset; SET @thetime = '23:15:59.1234567'; SET @thedatetimeoffset = @thetime; SET @thedatetimeoffset = DATEADD(year, 285, @thedatetimeoffset); SELECT @thetime AS 'time', @thedatetimeoffset AS 'datetimeoffset';
結果:
+------------------+------------------------------------+ | time | datetimeoffset | |------------------+------------------------------------| | 23:15:59.1234567 | 2185-01-01 23:15:59.1234567 +00:00 | +------------------+------------------------------------+
この場合、年の値に285を追加すると、2185になります。