在尝试处理多个时区的服务器上的时间戳时,我遇到了一些重大的困惑。
我们在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
这告诉我两个日期的内部表示是相同的。从文档中,我理解为:
也许我误解了这一点......我认为它是UTC的天数偏移,也许它的当天时间偏移了?这意味着底层二进制数据是否存储在本地时间?但我不认为这是对的。
但是,这两个日期显然没有被视为相同。使用当前时间在Alpha处更新列放入正确的时间戳,然后两个站点同步并且Beta具有相同的基础二进制值,但运行初始选择(SELECT df FROM tbl
)将在未来提供近18个小时的时间...
尝试将时间转换为UTC也会产生不同的时间:
select
df,
DATEADD(MINUTE, DATEDIFF(MINUTE, GETDATE(), GETUTCDATE()), df)
from tbl
我感谢你坚持这么久。时区比Run DMC更棘手。
总结一下,我想: