2016-09-27 6 views
1

私はdatetime値を持っています。 その日時の値は、「東部標準時」や「インド標準時」などの任意のタイムゾーンに設定できます。 そのdatetime値をsqlのUTCタイムゾーンに変換したいとします。 ここから、タイムゾーンの値が与えられたパラメータになります。 私はこれもC#コードを使用して達成することができます。しかし、私はSQLクエリでこれが必要です。SQLクエリーを使用してdatetime値をあるタイムゾーンからUTCタイムゾーンに変換します

どのように私はそれを変換できますか教えていただけますか?

+0

これらのフィールドのデータ型は? – qxg

+2

[SQL Serverのタイムゾーンからタイムゾーンへの時刻の日付変換]の可能な複製(http://stackoverflow.com/questions/16872007/date-time-conversion-from-timezone-to-timezone-in-sql-server) –

+0

'datetimeoffset'を使う方が良いでしょうか?あなたはコンバージョンが必要ないでしょうか? –

答えて

1

は、SQL Server 2016を使用している場合は、新しいAT TIME ZONE句を使用することができます:オフセット

SELECT SalesOrderID, OrderDate, 
    OrderDate AT TIME ZONE 'Eastern Standard Time' AS OrderDate_TimeZoneEST, 
    OrderDate AT TIME ZONE 'Eastern Standard Time' 
    AT TIME ZONE 'UTC' AS OrderDate_TimeZoneUTC 
FROM Sales.SalesOrderHeader; 
5

タイムゾーンとタイムゾーンが2つの異なるものですが。夏時間が使用される場合、タイムゾーンは異なるオフセットを持つことができます。タイムゾーンのサポートがSQL Serverの最新バージョンである2016に追加されました。

datetimeの値をoffset/timezoneの値に変換する方法と、その値をUTCに変換する方法について説明します。

SQL Server 2014までのバージョンでは、ローカルタイムゾーンの正しいオフセットを事前に決定する必要があります(C#コードなど)。あなたはそれを持っていたら、TODATETIMEOFFSETで特定のオフセットで `のDateTimeOffsetにdatetimeを変換することができます:

select TODATETIMEOFFSET(GETDATE(),'02:00') 

または

select TODATETIMEOFFSET(GETDATE(),120) 

これは元の時間と指定したオフセットでdatetimeoffset値を返します。オフセット別に

スイッチ(例えばUTC)がSWITCHOFFSET機能

select SWITCHOFFSET(@someDateTimeOffset,0) 

によって行われるあなたはオフセット

select SWITCHOFFSET(TODATETIMEOFFSET(GETDATE(),120),0) 

との両方を組み合わせることができ、パラメータとして渡すことができます。あなたのフィールドがSomeTime呼ばれると仮定すると、あなたはタイムゾーン名を使用することができますSQL Serverの2016年に

select SWITCHOFFSET(TODATETIMEOFFSET(SomeTime,@offsetInMinutes),0) 

を書くことができます。あなたはまだUTCに最初のローカルタイムゾーンに、しかし二重の変換を必要とする:

SELECT (getdate() at time zone 'Central Europe Standard Time') AT TIME ZONE 'UTC' 

最初AT TIMEZONEオフセット+2:00datetimeoffsetを返し、第二は、UTCに変換します。

あなたはdatetimeの代わりにdatetimeinfoタイプを使用している場合は、おそらくすべての変換を避けることができ

NOTE。 SQL Serverでは、異なるオフセットの値に対して比較、フィルタリング、計算などを行うことができるため、クエリを行うために変換を行う必要はありません。クライアント側では、.NETには同等のDateTimeOffsetタイプがあります。したがって、クライアントコードで変換を行う必要はありません。

+1

その日付に使用された正確なオフセットがわからない場合はどうなりますか?たとえば、 'TODATETIMEOFFSET(GETDATE()、120)'は今日60分を返しますが、DSTのために過去120分を返していました。 –

関連する問題