2016-09-27 55 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)。 –

相关问题