Są to dwa różne wywołania funkcji, które mogą zwrócić dwa różne czasy.
Dodatkowo GETDATE
zwraca datetime
datatype, który ma precyzję tylko 3-4 ms, podczas gdy SYSDATETIME()
zwraca datetime2(7)
typ danych.
Nawet jeśli oba połączenia miałyby powrócić dokładnie w tym samym czasie, możesz zobaczyć problem, którego doświadczasz z powodu zaokrąglania.
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*/
Druga odpowiedź jest nieprawidłowa, jeśli podstawisz w GETDATE()
funkcja jest wywoływana tylko raz, co można zademonstrować poniżej.
WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0
PRINT 'This will not run in an infinite loop'
Podczas uruchamiania pętli na moim pulpicie Windows XP za pomocą GETDATE()
i SYSDATETIME
Widzę też wyniki, które wskazują, że może dziać się również coś innego. Być może wywołanie innego 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
Przykładowe wyniki poniżej
+-----------------------------+-----------------------------+-----+
| 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 |
+-----------------------------+-----------------------------+-----+
Interesujące wiersze to
| 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 |
Ta rozbieżność jest zbyt duża, aby była problemem zaokrąglania i nie może być tylko problemem z czasem z opóźnieniem między wywołaniem dwóch funkcji, ponieważ problem występuje w więcej niż jednym wierszu, który GETDATE
raporty 10:16:03.26X
podczas gdy SYSDATETIME
raporty 10:16:03.250