为什么SQL Server会丢失一毫秒?

时间:2009-04-03 19:49:20

标签: sql sql-server

我有一个像这样的结构表:

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列。

为什么我似乎失去了一毫秒?

6 个答案:

答案 0 :(得分:86)

SQL Server仅将时间存储到大约1/300秒。这些总是落在0,3和7毫秒。例如。从最小增量的0开始计数:

00:00:00.000
00:00:00.003
00:00:00.007
00:00:00.010
00:00:00.013
...

如果您需要毫秒级的精确度,那么就没有令人愉快的方法。我见过的最佳选项是将值存储在自定义数字字段中,并在每次获取值时重建它,或将其存储为已知格式的字符串。然后,您可以(可选)为了速度而在本机日期类型中存储“近似”日期,但它会引入通常不需要的概念复杂性。

答案 1 :(得分:33)

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

参考:time and datetime2 - Exploring SQL Server 2008's New Date/Time Data Types

答案 2 :(得分:27)

SQL Server datetime类型只有1/300秒(~3.33̅ms)的分辨率,因此您可能会看到舍入错误。

请参阅MSDN Datetime SQL Server reference

答案 3 :(得分:6)

SQL Server仅精确到1/300秒。它将值舍入到最接近的1/300。

答案 4 :(得分:3)

DATETIME没有无限精度 - 您可能正在使用无法用可用位准确表示的值。

答案 5 :(得分:2)

SQL Server将datetime值存储为3毫秒的精度。 (我听说过这个,但找不到官方的参考资料。)