Det er to forskellige funktionskald, der kan returnere to forskellige tidspunkter.
Derudover GETDATE
returnerer en datetime
datatype, som kun har en præcision på 3-4 ms, hvorimod SYSDATETIME()
returnerer en datetime2(7)
datatype.
Selvom begge opkald skulle returnere nøjagtigt samme tid, kunne du se det problem, du oplever på grund af afrunding.
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*/
Det andet svar er forkert, hvis du erstatter i GETDATE()
funktionen kaldes kun én gang, som det kan demonstreres fra nedenstående.
WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0
PRINT 'This will not run in an infinite loop'
Når jeg kører en loop på mit Windows XP-skrivebord med GETDATE()
og SYSDATETIME
Jeg kan også se resultater, der indikerer, at der måske også er noget andet i gang. Måske kalder en anden 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
Eksempelresultater nedenfor
+-----------------------------+-----------------------------+-----+
| 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 |
+-----------------------------+-----------------------------+-----+
Rækkerne af interesse er
| 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 |
Denne uoverensstemmelse er for stor til at være et afrundingsproblem og kan ikke bare være et timingproblem med en forsinkelse mellem kald af de to funktioner, da problemet eksisterer på mere end én række, GETDATE
rapporter 10:16:03.26X
mens SYSDATETIME
rapporter 10:16:03.250