2016-09-27 163 views
1

UTC時區我有一個日期時間值。 該日期時間值可能在任何時區,如「東部標準時間」或「印度標準時間」。 我想在SQL中將該日期時間值轉換爲UTC時區。 這裏來自時區的值將是給定的參數。 我也可以用c#代碼實現這一點,但我需要在sql查詢中。轉換日期時間值從一個時區到使用SQL查詢

誰能告訴我怎麼可以轉換?

+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

時區和區偏移量是兩個不同的東西。如果使用夏令時,時區可以有不同的偏移量。時區支持已添加到SQL Server的最新版本,2016年。

您的問題有兩個部分 - 如何將datetime值轉換爲offset/timezone值,然後如何將該值轉換爲UTC。

在SQL Server 2014以前的版本中,您必須事先確定本地時區的正確偏移量,例如使用C#代碼。一旦你擁有了它,你可以一個datetime轉換成`DATETIMEOFFSET與特定的與TODATETIMEOFFSET偏移:

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

select TODATETIMEOFFSET(GETDATE(),120) 

這將返回一個datetimeoffset值與原來的時間和指定的偏移。

切換到另一個偏移量(例如UTC)由SWITCHOFFSET功能與

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

可以作爲參數傳遞偏移進行

select SWITCHOFFSET(@someDateTimeOffset,0) 

您可以結合兩者。假設你的領域被稱爲SomeTime,你可以寫

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

在SQL Server 2016可以使用時區名。你仍然需要一個雙轉換不過,首先到當地時區再到UTC:

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

第一AT TIMEZONE返回datetimeoffset+2:00偏移和第二將其轉換爲UTC。

你也許可以避開所有的轉換,如果你使用的datetimeinfo類型,而不是datetime。 SQL Server允許對不同偏移量的值進行比較,過濾,計算等,因此您無需爲查詢進行任何轉換。在客戶端,.NET具有等效的DateTimeOffset類型,因此您不需要在客戶端代碼中進行任何轉換。

+1

如果您不知道該日期使用的準確偏移量,會發生什麼情況?例如'TODATETIMEOFFSET(GETDATE(),120)'今天返回60分鐘,但過去會返回120分鐘(因爲DST)。 –

相關問題