在Windows Server 2008 R2上运行SQL Server 2008 R2。
我们最近发现SQL Server getdate()函数似乎没有像我期望的那样在当地时间凌晨2:00切换到/从夏令时开始。服务器的时区设置为“(UTC-06:00)中部时间(美国和加拿大)”,并选中“自动调整夏令时的时钟”复选框。
作为一个例子,我们有一个包含多个列的表,其中一个列的类型为datetime,默认约束为getdate()。我们有一个将记录插入该表的进程,允许SQL为该列提供默认值。这是我们2017年3月12日早上(中部时间)早些时候运行的结果:
上面的结果按标识列排序,因此我假设按列出的顺序插入。根据美国中部时间的夏令时规则,粗体中的时间无效。最后,在大约一分钟和21秒之后,系统发现它需要切换到DST,因此所有后续记录都是正确的。当切换回11月的标准时间时似乎存在类似的问题 - getdate()继续在DST返回时间超过第一次出现的凌晨2:00,然后跳回一小时到标准时间。
也许这只是底层Windows API GetLocalTime函数的行为方式?无论如何,我的问题是:
FWIW,我们正在将此和其他类似的日期时间列转换为类型datetimeoffset,并计划使用sysdatetimeoffset()SQL函数来填充它。我们在开发脚本以更新现有数据的偏移量时发现了这种意外行为。
提前感谢您提供与此主题相关的任何信息!
@@ version = Microsoft SQL Server 2008 R2(SP3) - 10.50.6220.0(X64) 2015年3月19日12:32:14 版权所有(c)Microsoft Corporation Windows NT 6.1(Build 7601:Service Pack 1)上的企业版(64位)