为什么SQLServer会丢失毫秒?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

表如下:

CREATE TABLE [TESTTABLE]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DateField] [datetime] NULL,
    [StringField] [varchar](50),
    [IntField] [int] NULL,
    [BitField] [bit] NULL
)

我执行以下代码:

BEGIN 
   INSERT INTO TESTTABLE (IntField, BitField, StringField, DateField) 
   VALUES ('1', 1, 'hello', {ts '2009-04-03 15:41:27.378'});  

   SELECT SCOPE_IDENTITY()  
END

然后

select * from testtable with (NOLOCK)

我的结果显示:

2009-04-03 15:41:27.*377*

DateField列。

为什么?

提问于
用户回答回答于

SQLServer仅将时间存储到大约1/第三百秒。这些时间总是在0,3和7毫秒之间。例如,从最小增量中的0开始计数:

00:00:00.000

00:00:00.003

00:00:00.007

00:00:00.010

00:00:00.013

...

如果你需要那毫秒的精确性,那就没有什么好对付的了。我见过的最佳选项是在每次获取值时将值存储在自定义数字字段中并重新构建它,或者将其存储为已知格式的字符串。

用户回答回答于

SQLServer 2008具有更高的可用精度。datetime 2类型将准确地存储如下值:2008-12-19 09:31:38.5670514(精确度为100纳秒)。

扫码关注云+社区