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'不是更好,所以你不需要任何转换? –