UTC時區我有一個日期時間值。 該日期時間值可能在任何時區,如「東部標準時間」或「印度標準時間」。 我想在SQL中將該日期時間值轉換爲UTC時區。 這裏來自時區的值將是給定的參數。 我也可以用c#代碼實現這一點,但我需要在sql查詢中。轉換日期時間值從一個時區到使用SQL查詢
誰能告訴我怎麼可以轉換?
UTC時區我有一個日期時間值。 該日期時間值可能在任何時區,如「東部標準時間」或「印度標準時間」。 我想在SQL中將該日期時間值轉換爲UTC時區。 這裏來自時區的值將是給定的參數。 我也可以用c#代碼實現這一點,但我需要在sql查詢中。轉換日期時間值從一個時區到使用SQL查詢
誰能告訴我怎麼可以轉換?
如果您正在使用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;
時區和區偏移量是兩個不同的東西。如果使用夏令時,時區可以有不同的偏移量。時區支持已添加到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
類型,因此您不需要在客戶端代碼中進行任何轉換。
如果您不知道該日期使用的準確偏移量,會發生什麼情況?例如'TODATETIMEOFFSET(GETDATE(),120)'今天返回60分鐘,但過去會返回120分鐘(因爲DST)。 –
這些字段的數據類型是什麼? – qxg
[日期時間從時區轉換到SQL Server時區]可能的重複(http://stackoverflow.com/questions/16872007/date-time-conversion-from-timezone-to-timezone-in-sql-server) –
使用'datetimeoffset'不是更好,所以你不需要任何轉換? –