SQL Server日期和TimeZone混淆

时间:2014-10-28 19:21:21

标签: sql-server datetime sql-server-2012 timezone

在尝试处理多个时区的服务器上的时间戳时,我遇到了一些重大的困惑。

我们在UTC + 12和UTC-6中分别有两个SQL Server(Alpha和Beta),每天都有记录。我们的问题是,如果使用Alpha中的时间戳更新记录并与Beta同步,则Beta时间似乎具有确切时间(以本地时间形式)作为Alpha本地时间而不是UTC。

我知道存在很多潜在的陷阱,但似乎两个服务器都具有相同的时间戳二进制表示,所以真正的问题是"我们是否以某种方式错误配置了SQL Server?或者同步软件是否需要转换二进制日期?"

首先执行

SELECT GETUTCDATE()
SELECT GETDATE()
两台服务器上的

给出相同的UTC日期/时间和正确的本地时间,因此它们在适当的时区配置。

df定义为日期列

SELECT df FROM tbl

Result
-------------------
2014-10-29 00:49:57.870
两种环境中的

都提供相同的人类可读字符串

此外,从两个系统上的字段中选择基础二进制数据会得到相同的值:

select cast(df as binary(8)) 
from tbl

Result
------------------
0x0000A3D3000DB921

这告诉我两个日期的内部表示是相同的。从文档中,我理解为:

  • 前4个字节 - 自1900年1月1日以来的天数
  • 第二个4个字节 - 自午夜以来的时间刻度

也许我误解了这一点......我认为它是UTC的天数偏移,也许它的当天时间偏移了?这意味着底层二进制数据是否存储在本地时间?但我不认为这是对的。

但是,这两个日期显然没有被视为相同。使用当前时间在Alpha处更新列放入正确的时间戳,然后两个站点同步并且Beta具有相同的基础二进制值,但运行初始选择(SELECT df FROM tbl)将在未来提供近18个小时的时间...

尝试将时间转换为UTC也会产生不同的时间:

select 
    df, 
    DATEADD(MINUTE, DATEDIFF(MINUTE, GETDATE(), GETUTCDATE()), df) 
from tbl
  • Alpha的结果 - 2014-10-28 11:49:57.870(正确的UTC时间)
  • 测试结果 - 2014-10-29 06:49:57.870

我感谢你坚持这么久。时区比Run DMC更棘手。

总结一下,我想:

  • 在不同时区的数据库之间同步绝对(UTC)时间的首选方式是什么?
  • SQL Server日期戳的二进制表示实际上是什么意思? (我知道应该从帮助文档中回答,但我找不到正确的文档)

0 个答案:

没有答案