sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor Datediff mellem GETDATE() og SYSDATETIME() i millisekunder er altid anderledes?

Det er to forskellige funktionskald, der kan returnere to forskellige tidspunkter.

Derudover GETDATE returnerer en datetime datatype, som kun har en præcision på 3-4 ms, hvorimod SYSDATETIME() returnerer en datetime2(7) datatype.

Selvom begge opkald skulle returnere nøjagtigt samme tid, kunne du se det problem, du oplever på grund af afrunding.

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 andet svar er forkert, hvis du erstatter i GETDATE() funktionen kaldes kun én gang, som det kan demonstreres fra nedenstående.

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

Når jeg kører en loop på mit Windows XP-skrivebord med GETDATE() og SYSDATETIME Jeg kan også se resultater, der indikerer, at der måske også er noget andet i gang. Måske kalder en anden 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 
 

Eksempelresultater nedenfor

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

Rækkerne af interesse er

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

Denne uoverensstemmelse er for stor til at være et afrundingsproblem og kan ikke bare være et timingproblem med en forsinkelse mellem kald af de to funktioner, da problemet eksisterer på mere end én række, GETDATE rapporter 10:16:03.26X mens SYSDATETIME rapporter 10:16:03.250



  1. Vedligeholdelse/opdatering af postrækkefølge i mysql

  2. Oracle Fast Recovery Area

  3. Skinnemodellering:konvertering af HABTM til has_many :through

  4. Kopier tabel til en anden database på en anden SQL Server