为什么GETDATE()和SYSDATETIME()之间的Datediff在几毫秒内总是不同?

him*_*056 0 datediff getdate sql-server-2008 sysdatetime

我试图让Datediff之间GETDATE()SYSDATETIME()以毫秒为单位.

SELECT DATEDIFF(ms, GETDATE() , SYSDATETIME());        
Run Code Online (Sandbox Code Playgroud)

我得到的结果是0123.造成这种差异的原因是什么?

看到这个小提琴.

Mar*_*ith 9

它们是两个不同的函数调用,可以返回两个不同的时间.

此外,GETDATE返回datetime仅具有3-4 ms精度的数据类型,同时SYSDATETIME()返回datetime2(7)数据类型.

即使两个呼叫都返回完全相同的时间,您也可以看到由于四舍五入而遇到的问题.

DECLARE @D1 DATETIME2 = '2012-08-18 10:08:40.0650000'
DECLARE @D2 DATETIME = @D1 /*Rounded to 2012-08-18 10:08:40.067*/
SELECT DATEDIFF(ms, @D1 , @D2) /*Returns 2*/
Run Code Online (Sandbox Code Playgroud)

另一个答案是错误的,如果你在GETDATE()函数中替换只被调用一次,如下面所示.

WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0 
PRINT 'This will not run in an infinite loop'
Run Code Online (Sandbox Code Playgroud)

在我的Windows XP桌面上运行循环时GETDATE(),SYSDATETIME我也可以看到结果,表明其他东西可能正在进行中.也许调用不同的API.

CREATE TABLE #DT2
  (
     [D1] [DATETIME2](7),
     [D2] [DATETIME2](7)
  )

GO

INSERT INTO #DT2
VALUES(Getdate(), Sysdatetime())

GO 100

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

DROP TABLE #DT2 
Run Code Online (Sandbox Code Playgroud)

以下示例结果

+-----------------------------+-----------------------------+-----+
|             D1              |             D2              | MS  |
+-----------------------------+-----------------------------+-----+
| 2012-08-18 10:16:03.2500000 | 2012-08-18 10:16:03.2501680 |   0 |
| 2012-08-18 10:16:03.2530000 | 2012-08-18 10:16:03.2501680 |  -3 |
| 2012-08-18 10:16:03.2570000 | 2012-08-18 10:16:03.2501680 |  -7 |
| 2012-08-18 10:16:03.2600000 | 2012-08-18 10:16:03.2501680 | -10 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2501680 | -13 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2657914 |   2 |
| 2012-08-18 10:16:03.2670000 | 2012-08-18 10:16:03.2657914 |  -2 |
| 2012-08-18 10:16:03.2700000 | 2012-08-18 10:16:03.2657914 |  -5 |
| 2012-08-18 10:16:03.2730000 | 2012-08-18 10:16:03.2657914 |  -8 |
| 2012-08-18 10:16:03.2770000 | 2012-08-18 10:16:03.2657914 | -12 |
| 2012-08-18 10:16:03.2800000 | 2012-08-18 10:16:03.2814148 |   1 |
+-----------------------------+-----------------------------+-----+
Run Code Online (Sandbox Code Playgroud)

感兴趣的行是

| 2012-08-18 10:16:03.2600000 | 2012-08-18 10:16:03.2501680 | -10 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2501680 | -13 |
Run Code Online (Sandbox Code Playgroud)

这种差异太大而不能成为一个舍入问题,并且不能只是一个时间问题,在调用两个函数之间有一个延迟,因为问题存在于GETDATE报告的多个行上10:16:03.26XSYSDATETIME报告10:16:03.250