66

フィールドを持つテーブルを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`.

乾杯 :)

4

6 に答える 6

85

ほとんどすべてのスタイルを使用して変換すると、datetime2値がUTCに変換されます。
また、datetime2からdatetimeoffsetへの変換は+00:00、以下のようにオフセットをに設定するだけなので、からに変換する簡単な方法ですDatetimeoffset(offset!=0)Datetimeoffset(+00:00)

declare @createdon datetimeoffset
set @createdon = '2008-12-19 17:30:09.1234567 +11:00'

select CONVERT(datetime2, @createdon, 1)
--Output: 2008-12-19 06:30:09.12

select convert(datetimeoffset,CONVERT(datetime2, @createdon, 1))
--Output: 2008-12-19 06:30:09.1234567 +00:00
于 2011-02-10T07:01:26.620 に答える
38

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

select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
于 2014-08-21T03:02:52.113 に答える
31

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

于 2016-06-17T19:32:49.227 に答える
13

SQL ServerでのDateTimeoffset(タイムゾーン)変換。

SQL Server 2016(13.x)以降

Select GETUTCDATE()
Select Convert(DATETIME, GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time')
Select Convert(DATETIME, GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time')

結果は

2020-08-18 08:22:21.640
2020-08-18 10:22:21.640
2020-08-18 13:52:21.640
于 2020-08-18T08:26:25.253 に答える
8

注:スタイル(ここでは「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;
于 2011-02-10T06:28:28.530 に答える
0

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

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

于 2019-07-26T15:51:48.657 に答える