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

Sådan rettes "datediff-funktionen resulterede i et overløb"-fejl i SQL Server

Denne artikel giver en løsning på et problem, du lejlighedsvis kan støde på, mens du bruger DATEDIFF() funktion i SQL Server.

Hvis du støder på følgende fejl:

Datediff-funktionen resulterede i et overløb. Antallet af datodele, der adskiller to dato-/tidsforekomster, er for stort. Prøv at bruge datediff med en mindre præcis datodel.

Det er fordi returværdien er for stor. DATEDIFF() funktion returnerer sit resultat som en int datatype. Grunden til at du fik denne besked er, at returværdien er for stor til int datatype. Heldigvis er der en nem måde at løse dette på.

Den hurtigste og nemmeste måde at løse dette problem på er at skifte til DATEDIFF_BIG() fungere. Denne funktion fungerer nøjagtigt som DATEDIFF() , bortset fra at dens returdatatype er en signeret bigint . Den kan med andre ord klare rigtig store tal.

Eksempel

Lad os se om DATEDIFF() kan fortælle os, hvor mange millisekunder der er i tusind år:

SELECT DATEDIFF( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years';

Resultat:

The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart. 

Måske ikke. Det ser ud til, at der er for mange millisekunder til at passe ind i en int .

Tid til de store kanoner. DATEDIFF_BIG() , gør dine ting...

SELECT DATEDIFF_BIG( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years';  

Resultat:

Milliseconds in 1000 years
--------------------------
31556908800000            

Det er bedre.

Hvis du stadig får ovenstående fejlmeddelelse, skal du prøve at returnere en virkelig stort antal. I så fald skal du gøre mindst ét ​​af følgende:

  • Brug en kortere tidsperiode.
  • Brug en mindre præcis datodel . For eksempel, i stedet for at prøve at returnere antallet af millisekunder, prøv det med blot sekunder.

Bemærk også, at du skal køre mindst SQL Server 2016, før du kan bruge DATEDIFF_BIG() funktion.


  1. SQL - Find manglende int-værdier i for det meste ordnede sekventielle serier

  2. PL/SQL - Brug listevariabel i Where In-klausul

  3. Let i en nøddeskal

  4. Failover for PostgreSQL-replikering 101