代码之家  ›  专栏  ›  技术社区  ›  sproketboy

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

  •  60
  • sproketboy  · 技术社区  · 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 列。

    你知道我为什么会损失一毫秒吗??

    6 回复  |  直到 6 年前
        1
  •  84
  •   Whatsit    15 年前

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

    00∶00:0
    00∶00:0.003
    00∶00:0.007
    00∶00:0.010
    00∶00:0.013

    如果你需要毫秒的精确性,那就没有什么好办法了。我看到的最佳选项是将值存储在自定义数字字段中,并在每次获取值时重新生成它,或者将其存储为已知格式的字符串。然后,您可以(可选地)以本机日期类型存储一个“近似”日期,以提高速度,但它引入了一个概念上的复杂性,这通常是不需要的。

        2
  •  32
  •   nikib3ro    10 年前

    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

        3
  •  27
  •   Eli Rose    7 年前

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

    MSDN Datetime SQL Server reference

        4
  •  6
  •   TheCloudlessSky    11 年前

    SQL Server只能精确到1/300秒。它将值四舍五入到最接近的1/300。

        5
  •  3
  •   anon    15 年前

    日期时间没有无限的精度-您可能正在使用一个不能用可用位精确表示的值。

        6
  •  2
  •   Bhargav Rao Ankit    6 年前

    SQL Server将日期时间值存储到3毫秒的精度。(我听说过,但找不到正式的参考资料。)