Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 为什么GETDATE()和SYSDATETIME()之间的Datediff(毫秒)总是不同?_Sql Server 2008_Datediff_Getdate_Sysdatetime - Fatal编程技术网

Sql server 2008 为什么GETDATE()和SYSDATETIME()之间的Datediff(毫秒)总是不同?

Sql server 2008 为什么GETDATE()和SYSDATETIME()之间的Datediff(毫秒)总是不同?,sql-server-2008,datediff,getdate,sysdatetime,Sql Server 2008,Datediff,Getdate,Sysdatetime,我正在尝试以毫秒为单位获取GETDATE和SYSDATETIME之间的Datediff SELECT DATEDIFF(ms, GETDATE() , SYSDATETIME()); 我得到的结果是0或1或2或3。造成这种差异的原因是什么 .它们不同,因为不能同时调用这两个函数。其他正在运行的进程可能会影响计时。有几十个原因可以根据不同的数量而有所不同 如果您使用两个GetDate调用来执行相同的操作,那么它们不会产生任何差异,因为数据库引擎足够聪明,可以找出它们是相同的,然后

我正在尝试以毫秒为单位获取GETDATE和SYSDATETIME之间的Datediff

SELECT DATEDIFF(ms, GETDATE() , SYSDATETIME());        
我得到的结果是0或1或2或3。造成这种差异的原因是什么


.

它们不同,因为不能同时调用这两个函数。其他正在运行的进程可能会影响计时。有几十个原因可以根据不同的数量而有所不同

如果您使用两个GetDate调用来执行相同的操作,那么它们不会产生任何差异,因为数据库引擎足够聪明,可以找出它们是相同的,然后重新使用结果。不过,使用GetDate和SysDateTime是不同的,因为它们不是相同的代码路径,它们执行不同的操作


这样想:如果你看到1+2和1+2,很容易看到第一个表达式和第二个表达式是相同的,所以你只需要做一次计算。如果将其更改为1+Rand和1+Rand,则无法知道对Rand的两个不同调用将返回什么,因此必须分别进行计算。

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

此外,GETDATE返回的datetime数据类型的精度仅为3-4毫秒,而SYSDATETIME返回的是datetime27数据类型

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

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*/
另一个答案是不正确的,即如果在GETDATE中替换,则函数只调用一次,如下所示

WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0 
PRINT 'This will not run in an infinite loop'
当在我的WindowsXP桌面上使用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 
下面是示例结果

+-----------------------------+-----------------------------+-----+
|             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 |
+-----------------------------+-----------------------------+-----+
感兴趣的行是

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

这个差异太大,不可能是取整问题,也不可能只是调用两个函数之间存在延迟的时间问题,因为GETDATE报告10:16:03.26X的多行上存在这个问题,而SYSDATETIME报告10:16:03.250

这个差异是精度和分辨率之间差异的一个很好的例子暂时把准确性放在一边。
GETDATE返回一个DATETIME,其精度显然为毫秒,但是,如果将其放入一个紧密循环中,您会发现下一个不同的返回值是几毫秒后的值;它每秒只能返回大约300个不同的值,因为它的分辨率只有大约3或4毫秒。这是DATETIME数据类型的设计功能/折衷。

选择DATEDIFFms、GETDATE、GETDATE的是什么;return?引擎可能足够智能,可以缓存两个相同的表达式。因为不能同时调用这两个函数。其他正在运行的进程可能会影响计时。有几十个原因可以根据不同的数量而有所不同。出于好奇,你为什么要这么做?@KenWhite如果我们执行SELECT DATEDIFFms,GETDATE,GETDATE将来会执行两次或一次GETDATE吗?@hims056请记住,要找出谁在进行不合理的否决投票狂欢并不总是困难的……似乎函数使用的精度也不同,因为在D1中,最后四位数字始终为零。D2的情况并非如此,因为所有七位数字似乎都有意义。@Kiamaluno-是的。datetime数据类型的精度仅为每秒300个刻度。i、 e最多3位精度,最后一位为0、3或7。较新的datetime2数据类型最多可以表示7位小数精度。这个答案有误导性。即使可以同时调用这两个函数,毫秒级的结果通常也会不同。事实上,较早的GETDATE调用返回的时间可能比随后的SYSDATETIME晚,反之亦然。@brewmanz:这有何误导性?它确切地说,它们永远不会产生相同的结果。你读了第一句话,然后停了吗?有几个误导性的原因:A它们可以产生相同的结果,我可以预测这些情况何时会发生B当结果不同时,这不是因为这两个函数不能同时调用C它与使用Rand不同;结果是确定的,并且给定SysDateTime的结果,我很有可能预测相邻GetDate调用的结果。