2016-09-08 98 views
1

testdate成为日期时间列为d的表。我执行了这个sql请求几次,并在每次执行之间更改操作系统时区。检索SQL Server中记录的日期时间的时区(2005)

INSERT INTO [testdate] ([d]) 
    VALUES (CAST(GETDATE() AS DATETIME)) 

我得到了这样的结果:

 ________________________ 
    | d (datetime)   | 
.---|------------------------| 
| 1 | 2016-09-08 15:15:28.847| 
| 2 | 2016-09-08 18:15:45.407| 
| 3 | 2016-09-08 11:17:23.317| 
°----------------------------° 

首先在GMT + 6出战,在第二GMT + 9,最后在GMT + 1(夏令时)。我相信我会在当前时区获得所有这些行。

这些日期时间值是否存储为“快照”?或者有没有办法为每个值获取时区?

+2

这个问题和评论中的链接可以帮助你:http://dba.stackexchange.com/questions/39421/how-to-handle-timezone-properly-in-sql-server – TheGameiswar

回答

1

时区不与日期值一起存储。你可以阅读这个article: Solving the Datetime Mystery

那么SQL Server如何在内部存储日期?它使用8个字节到 存储日期时间值 - 日期的前4个和时间的第二个4。 SQL Server可以将两个4字节的集合解释为整数。 对于日期部分,SQL Server存储的值是在基准日期1900年1月1日之前或之后的天数 。由于此存储协议为 ,SQL Server假定1900年1月1日的日期为 在我的第一个例子中没有提供日期。 SQL Server内部 存储值0。负数表示较早的日期比 1月1日,1900年

SQL服务器存储用于时间 时钟的数目的第二整数午夜后蜱。第二个包含300个滴答,所以标记 等于3.3毫秒(ms)。通过将日期时间值转换为二进制(8)值和 ,可以使用子字符串函数来提取每个4字节的集合,从而可以看到天和 时钟滴答的值。图3中的代码 然后将每组4个字节转换为整数。

您可以使用datetime数据类型并以UTC时区存储日期,然后可以格式化日期,同时从数据库中以所需格式检索日期。

+0

这是可怕的,如果处理遗留数据... 谢谢。 – Amessihel

+0

@Amessihel - 这就是为什么还有一个'datetimeoffset'类型。如果你需要保持偏移量,不要使用'datetime' –

相关问题