Те са две различни извиквания на функции, които могат да върнат две различни времена.
Освен това GETDATE
връща datetime
тип данни, който има само точност от 3-4 ms, докато SYSDATETIME()
връща datetime2(7)
тип данни.
Дори и двете обаждания да се върнат точно по едно и също време, можете да видите проблема, който изпитвате поради закръгляване.
DECLARE @D1 DATETIME2 ='2012-08-18 10:08:40.0650000'DECLARE @D2 DATETIME =@D1 /*Закръглено до 2012-08-18 10:08:40.067*/SELECT DATEDIFF(ms , @D1 , @D2) /*Връща 2*/
Другият отговор е неправилен, ако заместите в GETDATE()
функцията се извиква само веднъж, както може да се демонстрира отдолу.
WHILE DATEDIFF(ms, GETDATE() , GETDATE()) =0 PRINT 'Това няма да работи в безкраен цикъл'
Когато изпълнявам цикъл на моя работен плот на Windows XP с GETDATE()
и SYSDATETIME
Мога също да видя резултати, които показват, че може да се случи и нещо друго. Може би извикване на различен API.
CREATE TABLE #DT2 ( [D1] [DATETIME2](7), [D2] [DATETIME2](7) )GOINSERT INTO #DT2VALUES(Getdate(), Sysdatetime())GO 100SELECT DISTINCT [D1] , [D2], Datediff(MS, [D1], [D2]) КАТО MSFROM #DT2DROP ТАБЛИЦА #DT2
Примерни резултати по-долу
+-----------------------------+------------- ----------------+-----+| 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 |+----------------------------+------------------ ------------+-----+
Интересните редове са
<предварителен код>| 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 |
Това несъответствие е твърде голямо, за да бъде проблем със закръгляването и не може да бъде просто проблем с времето със закъснение между извикването на двете функции, тъй като проблемът съществува на повече от един ред, който GETDATE
съобщава 10:16:03.26X
докато SYSDATETIME
съобщава 10:16:03.250