Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum ist Datediff zwischen GETDATE() und SYSDATETIME() in Millisekunden immer unterschiedlich?

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