Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego Datediff między GETDATE() i SYSDATETIME() w milisekundach jest zawsze różne?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wiele dni tygodnia przechowywanych w jednym polu

  2. Przenieś jedną wartość wiersza do drugiej w SQL

  3. SSIS z arkuszami Excel

  4. Jak konwertować między strefami czasowymi w SQL Server 2008?

  5. Pobierz schemat kolumn tabeli SQL z typem danych i maksymalną długością w wartości liczbowej