Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi Datediff entre GETDATE() et SYSDATETIME() en millisecondes est toujours différent ?

Ce sont deux appels de fonction différents qui peuvent renvoyer deux heures différentes.

De plus GETDATE renvoie un datetime type de données qui n'a qu'une précision de 3-4 ms alors que SYSDATETIME() renvoie un datetime2(7) Type de données.

Même si les deux appels devaient revenir exactement au même moment, vous pourriez voir le problème que vous rencontrez en raison de l'arrondissement.

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

L'autre réponse est incorrecte si vous substituez dans GETDATE() la fonction n'est appelée qu'une seule fois, comme on peut le voir ci-dessous.

WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0 
PRINT 'This will not run in an infinite loop'

Lors de l'exécution d'une boucle sur mon bureau Windows XP avec GETDATE() et SYSDATETIME Je peux également voir des résultats qui indiquent que quelque chose d'autre pourrait également se passer. Peut-être en appelant une API différente.

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 

Exemples de résultats ci-dessous

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

Les lignes d'intérêt sont

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

Cet écart est trop important pour être un problème d'arrondi et ne peut pas être simplement un problème de synchronisation avec un délai entre l'appel des deux fonctions car le problème existe sur plus d'une ligne qui GETDATE signale 10:16:03.26X alors que SYSDATETIME signale 10:16:03.250