2011-02-10 33 views
27

フィールドを持つテーブルをDATETIMEフィールドに変換したいが、オフセットに注意して時刻を再計算したいと思っている。これは実際には値をUTCに変換します。Sql Server 2008のDateTimeOffsetをDateTimeに変換するには

例えば、

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 <に変換されますこと - それはDATETIMEOFFSETだが、UTC

乾杯:)

答えて

45

をDATETIME2値がUTCに変換されます。
また、のDateTimeOffsetへDATETIME2からの変換は、単にそれがDatetimeoffset(offset!=0)からDatetimeoffset(+00:00)私はSQLオプションで構築使用したい

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 
+1

CONVERTの最後の引数 "1"は何を意味するのでしょうか?この引数のすべての例は、文字型を出力型または入力型として使用します。ここでは、datetimeoffsetをdatetimeに変換します。 –

+0

'convert()'関数は、出力のフォーマットを指定する3番目のパラメータをとります。 [https://www.w3schools.com/sql/func_convert.asp](http://www.w3schools.com/sql/func_convert.asp)。 1 = "mm/dd/yy"形式 –

+0

第3引数は、実際には 'datetimeoffset'から' datetime2'への変換には意味がありません。これは 'varchar'変換のためのものです。 https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql(これもW3Schoolsなので今より多くのオプションがあります!) – brianary

3

注:タイムゾーン情報にはスタイルが( "126" ここで)指定されていない場合変換でを廃棄されます。いずれにしても、TZ情報が以下のように正しく調整されています。 CAST and 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; 
+0

スタイル126とは何ですか?なぜ126? –

+0

@ Pure.Krome返信でCASTとCONVERTへのリンクを参照してください。私はISO 8601が好きで、1つを選んでいたからです。これは、サイバーウィキピッキング1とはまったく変わりません。上記のように(どちらの回答でも)特定のスタイル*はTZを考慮しないかもしれません。 –

+1

SQL Server 2008 R2のクイックテストでは、スタイル「0」を使用するか、(同等に)スタイルコードを省略してタイムゾーン情報を破棄するだけであることが示されています。 MSDNドキュメントに記載されている他のコードは、それを保存します。 –

17

に変換する簡単な方法ですので、下記につき、+00:00でオフセットを設定します:

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

これは古い質問ですが、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' 変換した結果のオフセットをサーバー上のDateTimeには-7:00は、2013年11月20日午後五時になります00.000。上記のロジックでは、サーバーのタイムゾーン、またはDateTime値のオフセットとは関係なく、サーバーのタイムゾーンでDateTimeに変換されます。

DateTime値には、値がサーバーのタイムゾーンにあるという前提が含まれているため、これを行う必要があると思います。

+0

ありがとうございますAzureでより多くのコードを実行しているが、オンプレミスのデータベースを照会すると、クラウドでDateTimeOffsetを使用できるようになり、通常はUTCとなり、ローカルサーバーのタイムゾーンを知らなくてもローカル時間に変換できます。クラウドでDateTimeOffesetを使用することで、クラウドがUTCでない場合でも私たちを孤立させることができます。 –

関連する問題