Bus*_*icK 72 t-sql sql-server timezone utc sql-server-2008
我们正在处理需要处理来自不同时区和夏令时设置的全球时间数据的应用程序.我们的想法是在内部以UTC格式存储所有内容,只为本地化用户界面来回转换.SQL Server是否提供任何机制来处理给定时间,国家和时区的翻译?
这一定是一个常见的问题,所以我很惊讶谷歌不会发现任何可用的东西.
有什么指针吗?
小智 60
这适用于当前与SQL Server主机具有相同UTC偏移量的日期; 它没有考虑夏令时的变化.替换YOUR_DATE为本地日期进行转换.
SELECT DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), YOUR_DATE);
Pio*_*iak 39
7年过去了......
实际上,这个新的SQL Server 2016功能正是您所需要的.
它被称为AT TIME ZONE,它将日期转换为指定的时区,考虑到DST(夏令时)的变化.
更多信息:https:
//msdn.microsoft.com/en-us/library/mt612795.aspx
use*_*155 21
虽然这些答案中的一些将会让您大吃一惊,但由于夏令时,您无法对SqlServer 2005及更早版本的任意日期执行此操作.使用当前本地和当前UTC之间的差异将给出我今天存在的偏移量.我还没有找到一种方法来确定相关日期的偏移量.
也就是说,我知道SqlServer 2008提供了一些可能解决该问题的新日期函数,但使用早期版本的人需要了解这些限制.
我们的方法是坚持UTC并在客户端执行转换,我们可以更好地控制转换的准确性.
Rob*_*ley 14
SQL Server 2008有一个名为的类型datetimeoffset.它对这类东西非常有用.
http://msdn.microsoft.com/en-us/library/bb630289.aspx
然后,您可以使用该函数SWITCHOFFSET将其从一个时区移动到另一个时区,但仍保持相同的UTC值.
http://msdn.microsoft.com/en-us/library/bb677244.aspx
抢
Mat*_*int 14
您可以使用我的SQL Server时区支持项目在IANA标准时区之间进行转换,如此处所列.
UTC到本地是这样的:
SELECT Tzdb.UtcToLocal('2015-07-01 00:00:00', 'America/Los_Angeles')
Run Code Online (Sandbox Code Playgroud)
本地到UTC是这样的:
SELECT Tzdb.LocalToUtc('2015-07-01 00:00:00', 'America/Los_Angeles', 1, 1)
Run Code Online (Sandbox Code Playgroud)
数字选项是用于在本地时间值受夏令时影响时控制行为的标志.这些在项目文档中有详细描述.
Kar*_*Mlp 10
这里是将一个区域转换DateTime为另一个区域的代码DateTime
DECLARE @UTCDateTime DATETIME = GETUTCDATE();
DECLARE @ConvertedZoneDateTime DATETIME;
-- 'UTC' to 'India Standard Time' DATETIME
SET @ConvertedZoneDateTime = @UTCDateTime AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time'
SELECT @UTCDateTime AS UTCDATE,@ConvertedZoneDateTime AS IndiaStandardTime
-- 'India Standard Time' to 'UTC' DATETIME
SET @UTCDateTime = @ConvertedZoneDateTime AT TIME ZONE 'India Standard Time' AT TIME ZONE 'UTC'
SELECT @ConvertedZoneDateTime AS IndiaStandardTime,@UTCDateTime AS UTCDATE
Run Code Online (Sandbox Code Playgroud)
注意:此(AT TIME ZONE)仅适用于SQL Server 2016+,此优势在转换为特定时区时自动考虑日光