我有一个日期时间值。 该日期时间值可以在任何时区,例如“东部标准时间”和“东部标准时间”。或者'印度标准时间'。 我想在sql中将该datetime值转换为UTC时区。 这里从时区值开始就是给定的参数。 我也可以使用c#代码实现这一点。但我在sql查询中需要这个。
任何人都可以告诉我如何转换它?
答案 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及更高版本。