この記事には、日時の変換例が含まれています datetimeoffsetの値 SQLServerの値。
日時を変換する場合 datetimeoffsetの値 、結果の値は、 datetimeoffsetに割り当てる秒の小数部の精度によって異なります。 、および指定したタイムゾーンオフセット。
日時 データ型の小数秒部分は最大3桁です。その精度は、.000、.003、または.007秒の増分に丸められます。
datetimeoffset 一方、データ型では、0から7までの秒の小数部の精度を指定できます。これを指定しない場合は、7(デフォルト)が使用されます。また、タイムゾーンオフセットがあり、元の値のオフセットを保持できます。ただし、日時 タイムゾーンの認識がないため、保持する既存の値はありません。この場合、タイムゾーンオフセットのデフォルトは+00:00です。
SQLServerには実際にはTODATETIMEOFFSET()
があります 関数。日付/時刻の値をdatetimeoffsetに変換するように特別に設計されています。 タイムゾーンオフセットを追加します。ただし、この関数を使用する際に注意すべき微妙な詳細があります。これについては、以下で説明します(例を示します)。
例1-暗黙の変換
まず、日時間の暗黙的な変換の例を次に示します。 およびdatetimeoffset 。
DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7); SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thedatetimeoffset = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset(7)';
結果:
+-------------------------+------------------------------------+ | datetime | datetimeoffset(7) | |-------------------------+------------------------------------| | 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +00:00 | +-------------------------+------------------------------------+
明示的に変換するために変換関数(以下のような)を使用していないため、これは暗黙的な変換です。この場合、 datetime を割り当てようとすると、SQLServerはバックグラウンドで暗黙的な変換を実行します。 datetimeoffsetの値 変数。
datetimeoffset 変数の秒の小数部の精度が高くなり、最終的に 1233333 の小数部になります。 (vs 123 日時の場合 価値)。また、 +00:00 のタイムゾーンオフセットになります。 。
7秒の精度を使用すると、 datetimeoffset が発生します ストレージに10バイトを使用します(精度を格納するバイトを含めると11バイト)。比較として、日時 8バイトのみを使用します。ただし、 datetimeoffsetの精度を下げることができます 7をより小さな数値に置き換えることによって値を設定します。これは、 datetime2を使用する場合と同じ概念です。 データ・タイプ。これが最終結果にどのように影響するかの例については、SQLServerで「datetime」を「datetime2」に変換するを参照してください。
例2–丸め
日時 データ型は、.000、.003、または.007秒の増分に丸められます。明示的に別の値に設定しても丸められます。それがどのように機能するかを知らない場合、これはあなたに多くの混乱を引き起こす可能性があります。 datetime を使用すると、混乱を招く可能性があるだけではありません。 それ自体で、その値を別のデータ型に変換するときに余分な混乱を引き起こす可能性があります。
これが私の意味を示す例です。
DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thedatetimeoffset = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset(7)';
結果:
+-------------------------+------------------------------------+ | datetime | datetimeoffset(7) | |-------------------------+------------------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 | +-------------------------+------------------------------------+
この例では、小数秒を125
に設定しました。 ただし、日時
127
に切り上げました (このデータ型は、.000、.003、または.007秒の増分にのみ丸めることができるため)。
datetimeoffset 一方、値は、小数秒を 1266667 に設定します 。
ただし、初期値を datetimeoffsetに設定するだけの場合 そもそも、その小数部分は 1250000 を返していたでしょう。 。
例3– CAST()を使用した明示的な変換
明示的な変換の例を次に示します。この場合、私はCAST()
を使用します SELECT
内で直接機能します 日時間で明示的に変換するステートメント およびdatetimeoffset 。
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';
結果:
+-------------------------+------------------------------------+ | datetime | datetimeoffset(7) | |-------------------------+------------------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 | +-------------------------+------------------------------------+
例4– CONVERT()を使用した明示的な変換
CONVERT()
を使用した明示的な変換の例を次に示します。 CAST()
の代わりに関数 。
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';
結果:
+-------------------------+------------------------------------+ | datetime | datetimeoffset(7) | |-------------------------+------------------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 | +-------------------------+------------------------------------+
例5–タイムゾーンオフセットの変更
日時を変換するのに苦労している場合 datetimeoffsetの値 、おそらくタイムゾーンオフセットが必要です。また、+00:00以外に設定する可能性が高くなります。
幸い、TODATETIMEOFFSET()
を使用できます オフセットを変更する関数。
この関数を使用して、元の日時を変換することもできます datetimeoffsetの値 価値。この関数は、日付/時刻の値を受け入れます( datetime2 に解決できます) 値)、およびオフセット値。
次に例を示します:
DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime, '+07:00'); SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset';
結果:
+-------------------------+------------------------------------+ | datetime | datetimeoffset(7) | |-------------------------+------------------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 | +-------------------------+------------------------------------+
SELECT
内の関数を使用した例を次に示します。 ステートメント:
DECLARE @thedatetime datetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';
結果:
+-------------------------+------------------------------------+ | datetime | datetimeoffset(7) | |-------------------------+------------------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 | +-------------------------+------------------------------------+
TODATETIMEOFFSET()
に関する重要なポイント 関数は、渡された日付/時刻引数と同じ分数精度を使用することです。この場合は日時です 引数なので、スケールは3(つまり、3秒未満)です。これはあなたにとって問題かもしれないし、そうでないかもしれません。そうである場合は、いつでも datetimeoffsetに変換できます。 まず、変換された値をTODATETIMEOFFSET()
に渡します 。
例:
DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7); SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thedatetimeoffset = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset', TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';
結果(垂直出力を使用):
datetime | 2025-05-21 10:15:30.127 datetimeoffset | 2025-05-21 10:15:30.1266667 +00:00 Modified | 2025-05-21 10:15:30.1266667 +07:00