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

时间:2016-09-27 08:22:06

标签: sql-server datetime

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

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

5 个答案:

答案 0 :(得分:18)

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

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

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

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

select TODATETIMEOFFSET(GETDATE(),120)

这将返回datetimeoffset值,其中包含原始时间和指定的偏移量。

切换到另一个偏移量(例如UTC)由SWITCHOFFSET功能

执行
select SWITCHOFFSET(@someDateTimeOffset,0)

您可以将两者结合使用

select SWITCHOFFSET(TODATETIMEOFFSET(GETDATE(),120),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 :(得分:3)

要从一个区域转换到另一个区域,请使用 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;

这会导致所有图书都在美国东部时间时区购买。

答案 2 :(得分:2)

如果您使用的是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;  

答案 3 :(得分:0)

对于早于sql server 2012的用户,请使用以下查询,它对我有用。

DECLARE @localdate DATETIME = '2020-01-10 05:30';
Declare @DateDiff bigint =Datediff(minute, Getdate(),Getutcdate() ) --GetDate -current datetime of local
--Declare @DateDiff bigint =-330  --you ca declare timezone different in minutes also
SELECT @localdate AS LocalDate, Dateadd(minute, @DateDiff, @localdate) AS UTCConvertedDate;

答案 4 :(得分:0)

要使用时区名称转换为时区,可以执行以下操作:

查找服务器时区和您所在时区之间的分钟数
-- Change to your time zone name
declare @TimezoneName varchar(max) = 'New Zealand Standard Time'
declare @timezoneOffset bigint = Datediff( MINUTE, getdate() at time zone @TimezoneName, getdate() )

使用SWITCHOFFSET为您提供时区中的日期时间。

例如,当getdate()'2020-04-16 04:47:25.640'时 您将获得'2020-04-16 16:47:25.640 +12:00'(NZT为+12)

select SWITCHOFFSET(getdate(), @timezoneOffset) 

这应该适用于SQL Server 2016及更高版本。

相关问题