DATETIMEOFFSET
フィールドを持つテーブルをDATETIME
フィールドに変換したいと考えていますが、オフセットに注意して時間を再計算します。これは、実際には、値をUTC
に変換します。
例えば。
CreatedOn: 2008-12-19 17:30:09.0000000 +11:00
それはに変換されます
CreatedOn: 2008-12-19 06:30:09.0000000
または
CreatedOn: 2008-12-19 06:30:09.0000000 + 00:00 -- that's a `DATETIMEOFFSET`, but `UTC`.
乾杯:)
組み込みのSQLオプションを使用します。
select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
これは古い質問ですが、DateTimeOffsetをDateTimeに変換する場合は、変換先のサーバーのタイムゾーンを考慮する必要があると思います。 CONVERT(datetime、@MyDate、1)を実行するだけで、タイムゾーンが失われるだけで、誤った変換が行われる可能性があります。
最初にDateTimeOffset値のオフセットを切り替えてから、変換を行う必要があると思います。
DECLARE @MyDate DATETIMEOFFSET = '2013-11-21 00:00:00.0000000 -00:00';
SELECT CONVERT(DATETIME, SWITCHOFFSET(@MyDate, DATEPART(tz,SYSDATETIMEOFFSET())));
「2013-11-21 00:00:00.0000000 -00:00」をオフセットが-7:00であるサーバー上のDateTimeに変換した結果は、2013-11-20 17:00:00.000になります。上記のロジックでは、サーバーのタイムゾーンやDateTime値のオフセットは関係なく、サーバーのタイムゾーンでDateTimeに変換されます。
DateTime値には値がサーバーのタイムゾーンにあるという仮定が含まれているため、これを行う必要があると思います。
注:スタイル(ここでは「126」)が指定されていない場合、タイムゾーン情報は変換時に破棄されます。他のスタイルのいくつかでは破棄される可能性もありますが、私は知りません-いずれにしても、以下はTZ情報を正しく調整します。 CASTおよびCONVERT を参照してください。
_select convert(datetime, cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset), 126) as utc;
_
ハッピーSQL.
編集
それが重要かどうかはわかりませんが... datetime
そのレベルの精度/精度を実際に保存することはできません。上記を実行すると、秒の小数部は3桁に切り捨てられます(精度はそれよりも低くなります)。 _datetime2
_(およびdatetimeoffset(7)
)と同じ場合、切り捨てられていない値が生成されます。
_select convert(datetime2, cast('2008-12-19 17:30:09.1234567 +11:00' as datetimeoffset(7)), 126) as utc;
_
夏時間を考慮するために、私は以下を使用しました:
CONVERT(
DateTime,
SWITCHOFFSET(
CONVERT(
DateTimeOffset,
CONVERT(
DateTime,
[time_stamp_end_of_interval],
120
)
),
DATENAME(
TzOffset,
CONVERT(
DateTime,
[time_stamp_end_of_interval],
120
) AT TIME ZONE 'Pacific Standard Time'
)
)
)
AS GOOD_PST
注意: time_stamp_end_of_interval
はvarcharです