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
类型,因此您无需在客户端代码中进行任何转换.
如果您使用的是 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 时区购买的书籍。
归档时间: |
|
查看次数: |
41538 次 |
最近记录: |