sql >> Databasteknik >  >> RDS >> Sqlserver

Varför är Datediff mellan GETDATE() och SYSDATETIME() i millisekunder alltid olika?

De är två olika funktionsanrop som kan returnera två olika tider.

Dessutom GETDATE returnerar en datetime datatyp som bara har en precision på 3-4 ms medan SYSDATETIME() returnerar en datetime2(7) data typ.

Även om båda samtalen skulle återkomma exakt samtidigt kan du se problemet som du upplever på grund av avrundning.

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 andra svaret är felaktigt om du ersätter i GETDATE() funktionen anropas endast en gång, vilket kan visas nedan.

WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0 
PRINT 'This will not run in an infinite loop'

När jag kör en loop på mitt Windows XP-skrivbord med GETDATE() och SYSDATETIME Jag kan också se resultat som tyder på att något annat kan vara på gång. Kanske anropar ett annat 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 

Exempel på resultat nedan

+-----------------------------+-----------------------------+-----+
|             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 |
+-----------------------------+-----------------------------+-----+

Raderna av intresse är

| 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 |

Denna avvikelse är för stor för att vara ett avrundningsproblem och kan inte bara vara ett tidsproblem med en fördröjning mellan anropet av de två funktionerna eftersom problemet finns på mer än en rad som GETDATE rapporterar 10:16:03.26X medan SYSDATETIME rapporter 10:16:03.250



  1. Är det bättre att göra med en union i SQL eller separata frågor och sedan använda php array_merge?

  2. Minska licensieringskostnaderna för SQL Server

  3. Är det möjligt att BEGRÄNSA resultat från en JOIN-fråga?

  4. Konvertera rader till kolumner oracle SQL