Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que Datediff entre GETDATE() e SYSDATETIME() em milissegundos é sempre diferente?


São duas chamadas de função diferentes que podem retornar duas vezes diferentes.

Além disso, GETDATE retorna um datetime tipo de dados que tem precisão de apenas 3-4 ms enquanto SYSDATETIME() retorna um datetime2(7) tipo de dados.

Mesmo que ambas as chamadas retornassem exatamente ao mesmo tempo, você poderia ver o problema que está enfrentando devido ao arredondamento.
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*/

A outra resposta está incorreta se você substituir em GETDATE() a função é chamada apenas uma vez, como pode ser demonstrado abaixo.
WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0 
PRINT 'This will not run in an infinite loop'

Ao executar um loop na área de trabalho do Windows XP com GETDATE() e SYSDATETIME Eu também posso ver resultados que indicam que algo mais pode estar acontecendo também. Talvez chamando uma API diferente.
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 

Resultados de exemplo abaixo
+-----------------------------+-----------------------------+-----+
|             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 |
+-----------------------------+-----------------------------+-----+

As linhas de interesse são
| 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 |

Essa discrepância é muito grande para ser um problema de arredondamento e não pode ser apenas um problema de tempo com um atraso entre chamar as duas funções, pois o problema existe em mais de uma linha que GETDATE relatórios 10:16:03.26X enquanto SYSDATETIME relatórios 10:16:03.250