sql >> Database >  >> RDS >> Sqlserver

Waarom is Datediff tussen GETDATE() en SYSDATETIME() in milliseconden altijd anders?

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



  1. Hoe voeg ik meer leden toe aan mijn ENUM-type kolom in MySQL?

  2. Visual Basic Login-pagina die een fout veroorzaakt (Error BC30506 Handles-clausule vereist een WithEvents....)

  3. SQL-query om de impasses in SQL SERVER 2008 te krijgen

  4. Hoe Mysql fulltext zoeken met Chinese karakters uitvoeren?