Het zijn twee verschillende functieaanroepen die twee verschillende keren kunnen terugkeren.
Bovendien GETDATE
retourneert een datetime
datatype dat slechts een precisie van 3-4 ms heeft, terwijl SYSDATETIME()
retourneert een datetime2(7)
data type.
Zelfs als beide oproepen precies op dezelfde tijd zouden terugkeren, zou u het probleem kunnen zien dat u ondervindt vanwege afronding.
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*/
Het andere antwoord is onjuist dat als je vervangt in GETDATE()
de functie wordt maar één keer aangeroepen, zoals hieronder kan worden aangetoond.
WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0
PRINT 'This will not run in an infinite loop'
Bij het uitvoeren van een lus op mijn Windows XP-bureaublad met GETDATE()
en SYSDATETIME
Ik kan ook resultaten zien die erop wijzen dat er misschien ook iets anders aan de hand is. Misschien een andere API aanroepen.
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
Voorbeeldresultaten hieronder
+-----------------------------+-----------------------------+-----+
| 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 |
+-----------------------------+-----------------------------+-----+
De rijen van belang zijn
| 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 |
Deze discrepantie is te groot om een afrondingsprobleem te zijn en kan niet alleen een timingprobleem zijn met een vertraging tussen het aanroepen van de twee functies, aangezien het probleem bestaat op meer dan één rij die GETDATE
meldt 10:16:03.26X
terwijl SYSDATETIME
meldt 10:16:03.250