使用sql查询将datetime值从一个时区转换为UTC时区

use*_*329 8 sql-server datetime

我有一个日期时间值.该日期时间值可以在任何时区,如"东部标准时间"或"印度标准时间".我想在sql中将该datetime值转换为UTC时区.这里从时区值开始就是给定的参数.我也可以使用c#代码实现这一点.但我在sql查询中需要这个.

任何人都可以告诉我如何转换它?

Pan*_*vos 22

时区和时区偏移是两回事.如果使用夏令时,时区可以具有不同的偏移.在2016年的最新版本中,SQL Server添加了时区支持.

您的问题有两个部分 - 如何将datetime值转换为具有偏移/时区的值,然后如何将该值转换为UTC.

在SQL Server 2014之前的版本中,您必须提前确定本地时区的正确偏移量,例如使用C#代码.一旦你拥有它,你可以datetime使用TODATETIMEOFFSET将a转换为具有特定偏移量的`datetimeoffset :

select TODATETIMEOFFSET(GETDATE(),'02:00')
Run Code Online (Sandbox Code Playgroud)

要么

select TODATETIMEOFFSET(GETDATE(),120)
Run Code Online (Sandbox Code Playgroud)

这将返回datetimeoffset具有原始时间和指定偏移量的值.

切换到另一个偏移量(例如UTC)由SWITCHOFFSET函数执行

select SWITCHOFFSET(@someDateTimeOffset,0)
Run Code Online (Sandbox Code Playgroud)

你可以将两者结合起来

select SWITCHOFFSET(TODATETIMEOFFSET(GETDATE(),120),0)
Run Code Online (Sandbox Code Playgroud)

偏移量可以作为参数传递.假设您的字段被调用SomeTime,您可以写

select SWITCHOFFSET(TODATETIMEOFFSET(SomeTime,@offsetInMinutes),0)
Run Code Online (Sandbox Code Playgroud)

在SQL Server 2016中,您可以使用时区名称.您仍然需要双重转换,首先是本地时区,然后是UTC:

SELECT (getdate() at time zone 'Central Europe Standard Time') AT TIME ZONE 'UTC'
Run Code Online (Sandbox Code Playgroud)

第一个AT TIMEZONE返回datetimeoffset带有+2:00偏移的a ,第二个将它转换为UTC.

注意

如果您使用的是datetimeinfo类型,则可以避免所有转换datetime.SQL Server允许对不同偏移的值进行比较,过滤,计算等,因此您无需进行任何转换以进行查询.在客户端,.NET具有等效DateTimeOffset类型,因此您无需在客户端代码中进行任何转换.

  • 如果您不知道该日期使用的确切偏移量会发生什么?例如`TODATETIMEOFFSET(GETDATE(),120)`今天返回60分钟,但过去会返回120分钟(因为DST). (3认同)
  • @Panagiotis Kanavos:由于夏令时,这不起作用......因为您不知道任何可能时区的特定日期的偏移量。 (2认同)

Ste*_*ord 8

如果您使用的是 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;  
Run Code Online (Sandbox Code Playgroud)


小智 6

要从一个区域转换到另一区域,请使用 AT TIME ZONE ,

假设您有一个表 Book ,其购买时间以 UTC 形式存储在数据库中,并且您想知道 EST Zone 的时间。

Select bookName , CONVERT(datetime,purchasedTime) AT TIME ZONE 'UTC' AT TIME ZONE 'US Eastern Standard Time' as purchaseTimeInEST from Book;
Run Code Online (Sandbox Code Playgroud)

这会导致所有在 EST 时区购买的书籍。