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