web-dev-qa-db-ja.com

Sql Server 2008 DateTimeOffsetをDateTimeに変換する方法

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`.

乾杯:)

39
Pure.Krome

組み込みのSQLオプションを使用します。

select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
26
Vipeout

これは古い質問ですが、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値には値がサーバーのタイムゾーンにあるという仮定が含まれているため、これを行う必要があると思います。

19
Jeremy

注:スタイル(ここでは「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;
_
6
user166390

夏時間を考慮するために、私は以下を使用しました:

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です

0
Duane Pfeiffer