TSQL:如何将本地时间转换为UTC?(SQL Server 2008)

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);

  • 这不包括夏令时 (47认同)
  • 没有!差异取决于确切的日期.这取决于夏令时. (9认同)
  • 如果您知道今天的跑步不是历史性的,那么这很有效,谢谢 (9认同)
  • 在我的情况下,我只需要1个时区,这非常有用!谢谢. (3认同)
  • 谢谢,这是一个好主意,但它只适用于一个时区 - 本地机器.我们需要它来为任意时区工作...... (2认同)
  • 我也只使用一个时区,我转换的时间都是今天所以我不需要担心DST问题,但我发现我必须使用select dateadd(第二,( - 1*datediff(第二,getutcdate( ),getdate())),YOUR_DATE),否则我是2*我的差异. (2认同)

Pio*_*iak 39

7年过去了......
实际上,这个新的SQL Server 2016功能正是您所需要的.
它被称为AT TIME ZONE,它将日期转换为指定的时区,考虑到DST(夏令时)的变化.
更多信息:https: //msdn.microsoft.com/en-us/library/mt612795.aspx

  • 不再在这个项目上工作 - 不是在那个项目上,不是在SQL Server上,不是在同一家公司,甚至不在同一个国家;-)所以它对我没有帮助,但我会为找到这个问题的人提供帮助现在. (18认同)
  • 问题出在SQL Server 2008上.如果您接受此答案,请更新问题.谢谢 (4认同)
  • 要转换为 UTC,您可以执行“AT TIME ZONE 'UTC”。 (3认同)
  • @BuschnicK 是的,我想,但我来这里是为了寻找解决您遇到的相同问题的方法,所以我决定发布一个答案,因为现在有一个真正的解决方案:D (2认同)
  • @Piotr Owsiak:是的,但它假设输入时间是 UTC,如果你想从当地时间转换为 UTC,这是毫无意义的......所以 7 年过去了,他们仍然认为不值得正确处理这个问题。 .. (2认同)

use*_*155 21

虽然这些答案中的一些将会让您大吃一惊,但由于夏令时,您无法对SqlServer 2005及更早版本的任意日期执行此操作.使用当前本地和当前UTC之间的差异将给出我今天存在的偏移量.我还没有找到一种方法来确定相关日期的偏移量.

也就是说,我知道SqlServer 2008提供了一些可能解决该问题的新日期函数,但使用早期版本的人需要了解这些限制.

我们的方法是坚持UTC并在客户端执行转换,我们可以更好地控制转换的准确性.

  • 很遗憾这就是答案! (5认同)

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

  • SWITCHOFFSET不考虑夏令时,因此仅在某些情况下有用. (5认同)
  • 不.但问题是能够处理切换到请求的任何时区. (2认同)
  • @RobFarley检测客户端的时区并使用SWITCHOFFSET仍然可能出错.您需要知道转换的日期和时间是否应用了夏令时.简单地检测时区并将当前偏移量应用于UTC可能需要一小时 - 而且这只是一个简单的情况,即所有转换都在同一个国家/地区.并非每个国家/地区都会在相同日期切换到夏令时.如果您存储当地时间并了解同一国家/地区内原始区域和目标区域之间的差异,SWITCHOFFSET可以很好地工作. (2认同)

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+,此优势在转换为特定时区时自动考虑日光

  • 我喜欢这个,如果没有其他原因,它表明您可以将多个“AT TIME ZONE”调用(短语?)链接在一起!简直优雅。我之前说过 /sf/answers/3120542491/ 满足了我的需求,但这更好。主要荣誉。 (3认同)