设testdate
为日期时间列d
的表。我执行了这个sql请求几次,并在每次执行之间更改了操作系统的时区。
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(夏令时)。我相信我将得到当前时区的所有行。
这些日期时间值存储为"快照"吗?或者是否有一种方法可以获得每个值的时区?
时区不与日期值一起存储。你可以阅读这篇文章:解决日期时间之谜:
那么SQL Server内部是如何存储日期的呢?它使用8个字节来存储一个日期时间值——第一个4表示日期,第二个4表示时间时间。SQL Server可以将这两组4字节解释为整数。对于日期部分,SQL Server存储的值是日期的编号1900年1月1日基准日之前或之后的天数。正因为如此存储协议,SQL Server假定的日期为1900年1月1日,当我在第一个例子中没有提供日期。SQL Server内部存储值为0。负数表示日期早于1900年1月1日SQL Server将时间的第二个整数存储为的数字午夜过后,时钟滴答作响。一秒包含300个滴答声,所以是一个滴答声等于3.3毫秒(ms)。您可以看到天数和时钟通过将datetime值转换为二进制(8)值和使用substring函数提取每个4字节的集合。的代码在图3中,然后将每组4个字节转换为一个整数。
您可以使用datetime数据类型并以UTC时区存储日期,然后您可以在从数据库中以您想要的格式检索日期时格式化日期。