Es handelt sich um zwei verschiedene Funktionsaufrufe, die zwei verschiedene Zeiten zurückgeben können.
Zusätzlich GETDATE
gibt ein datetime
zurück Datentyp, der nur eine Genauigkeit von 3-4 ms hat, während SYSDATETIME()
gibt ein datetime2(7)
zurück Datentyp.
Selbst wenn beide Anrufe genau zur gleichen Zeit zurückkommen würden, könnten Sie das Problem sehen, das Sie aufgrund der Rundung haben.
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*/
Die andere Antwort ist falsch, wenn Sie GETDATE()
ersetzen die Funktion wird nur einmal aufgerufen, wie unten gezeigt werden kann.
WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0
PRINT 'This will not run in an infinite loop'
Beim Ausführen einer Schleife auf meinem Windows XP-Desktop mit GETDATE()
und SYSDATETIME
Ich kann auch Ergebnisse sehen, die darauf hindeuten, dass möglicherweise auch etwas anderes vor sich geht. Vielleicht Aufruf einer anderen 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
Beispielergebnisse unten
+-----------------------------+-----------------------------+-----+
| 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 |
+-----------------------------+-----------------------------+-----+
Die interessierenden Zeilen sind
| 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 |
Diese Diskrepanz ist zu groß, um ein Rundungsproblem darzustellen, und kann nicht nur ein Zeitproblem mit einer Verzögerung zwischen dem Aufrufen der beiden Funktionen sein, da das Problem in mehr als einer Zeile mit GETDATE
besteht meldet 10:16:03.26X
wohingegen SYSDATETIME
meldet 10:16:03.250