SQL Getdate的精度?

时间:2010-07-31 23:00:23

标签: sql-server-2005 precision getdate

我正在试验一个以高速率将数据插入SQL 2005 Server数据库(在XP SP3上)的程序。 (这是为了收集时间数据,以便我可以评估我的设计的不同方面)。

我的基本设置涉及将数据插入到如下表中(并使用仅指定有效负载字段的SP):

create table data
(
 Id int  PRIMARY KEY Identity,
 payload datatime not null,
 inserted datetime default (getdate()) not null
)

请注意,两个datetime字段也都有UNIQUE约束。

在客户端程序中,我在一个如此紧密的循环中调用SP,我在.Net DateTime.Now值的精度(以及可能的线程休眠)方面存在问题,因此违反了有效负载的唯一约束。我通过秒表变量,一些Thread.Sleep()和手动构造“有效载荷”数据的组合来解决,这样它就不会违反SQL DateTime字段的分辨率(3.3 mS)

但是,如果插件的生成速率介于5mS和10mS之间,那么我已经开始在SQL端看到“插入”字段的问题,其中一行被定期拒绝以获得唯一的密钥违规。只有当我将插入速度减慢到大于15左右时,这个问题才会消失。这个速度非常像我在.Net DateTime.Now上的精度问题(我在某个帖子上读了16mS)所以我想知道SQL Getdate()函数的实际精度是什么。

那么有人可以告诉我什么是支持GetDate(),它是否与.Net DateTime.Now值相同的源?我应该从中得到什么样的精确度?

另外,我知道SQL 2008服务器中的DATETIME2类型,因此提出了关于该系统中GetDate()的精度的问题。

2 个答案:

答案 0 :(得分:2)

DATETIME的精度为3.3ms,但GETDATE()并没有像你发现的那样返回精确到此的时间。查看MSDN page for date/time types/functions以获取有关新类型/功能如何工作的更多信息。

答案 1 :(得分:1)

DATETIME存储为2个整数。一个表示日期部分,另一个表示时间部分(午夜之后的刻度数),每个刻度is 1/300 of a second,因此它至少具有3.3毫秒的理论精度。

我刚试过在我的机器上运行它

declare @d  varchar(24)

while 1=1 
begin
set @d=CONVERT(VARCHAR(24), GETDATE(), 113)
raiserror('%s',0,1, @d) with nowait
end

并且进行了相当长的一次,它确实一次上升一个滴答,所以我认为没有任何固有的限制阻止它实现这一点。

01 Aug 2010 00:56:53:913
...
01 Aug 2010 00:56:53:913
01 Aug 2010 00:56:53:917
...
01 Aug 2010 00:56:53:917
01 Aug 2010 00:56:53:920
...
01 Aug 2010 00:56:53:920
01 Aug 2010 00:56:53:923

关于SQL Server 2008中GetDate()精度的查询,这与SQL2005相同。 sysdatetime意味着更高的精确度。我只是尝试运行以下内容,并对两个结果之间的差异感到惊讶。

SET NOCOUNT ON

CREATE TABLE #DT2(
[D1] [datetime2](7) DEFAULT (getdate()),    
[D2] [datetime2](7) DEFAULT (sysdatetime())
) 
GO

INSERT INTO #DT2
          DEFAULT  VALUES
GO 100

SELECT DISTINCT [D1],[D2],DATEDIFF(MICROSECOND, [D1], [D2]) AS MS
 FROM #DT2

结果

D1                           D2                              MS
----------------------------    -----------------------      ------
2010-08-01 18:45:26.0570000   2010-08-01 18:45:26.0625000     5500
2010-08-01 18:45:26.0600000   2010-08-01 18:45:26.0625000     2500
2010-08-01 18:45:26.0630000   2010-08-01 18:45:26.0625000     -500
2010-08-01 18:45:26.0630000   2010-08-01 18:45:26.0781250     15125
2010-08-01 18:45:26.0670000   2010-08-01 18:45:26.0781250     11125
2010-08-01 18:45:26.0700000   2010-08-01 18:45:26.0781250     8125