Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Защо Datediff между GETDATE() и SYSDATETIME() в милисекунди винаги е различен?

Те са две различни извиквания на функции, които могат да върнат две различни времена.

Освен това 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. В SQL Server, защо NULL не е равно на празен низ И не е равно на празен низ?

  2. Как да използвате Try Catch за показване на грешка при влизане за (App.Config) низ за връзка

  3. bcp:Грешка =[Microsoft][SQL Server Native Client 10.0]Низови данни, дясно съкращаване

  4. Как да разделите стойностите на една колона на стойности на няколко колони?

  5. Как да се свържете с екземпляр на SQL Server чрез използване на удостоверяване на Windows или удостоверяване на SQL Server - SQL Server / T-SQL урок, част 3