sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man fixar "datediff-funktionen resulterade i ett spill"-fel i SQL Server

Den här artikeln ger en lösning på ett problem som du ibland kan stöta på när du använder DATEDIFF() funktion i SQL Server.

Om du stöter på följande fel:

Datediff-funktionen resulterade i ett spill. Antalet datumdelar som separerar två datum/tid-instanser är för stort. Försök att använda datediff med en mindre exakt datumdel.

Det beror på att returvärdet är för stort. DATEDIFF() funktion returnerar sitt resultat som en int data typ. Anledningen till att du fick det här meddelandet är att returvärdet är för stort för int data typ. Lyckligtvis finns det ett enkelt sätt att fixa detta.

Det snabbaste och enklaste sättet att lösa det här problemet är att byta till DATEDIFF_BIG() fungera. Den här funktionen fungerar precis som DATEDIFF() , förutom att dess returdatatyp är en signerad bigint . Den klarar med andra ord riktigt stora siffror.

Exempel

Låt oss se om DATEDIFF() kan berätta hur många millisekunder det är på tusen å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. 

Kanske inte. Det verkar finnas för många millisekunder för att passa in i en int .

Dags för de stora kanonerna. DATEDIFF_BIG() , gör dina saker...

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

Resultat:

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

Det är bättre.

Om du fortfarande får ovanstående felmeddelande måste du försöka returnera ett verkligt stort antal. I så fall måste du göra minst ett av följande:

  • Använd en kortare tidsperiod.
  • Använd en mindre exakt datumdel . Till exempel, istället för att försöka returnera antalet millisekunder, försök med bara sekunder.

Observera också att du måste köra minst SQL Server 2016 innan du kan använda DATEDIFF_BIG() funktion.


  1. Ordlista över SQL Server-frågor — A Stick Shift för DBA:er

  2. Hur LPAD() fungerar i MariaDB

  3. Infoga flera rader UTAN att upprepa INSERT INTO ... delen av påståendet?

  4. Så här skapar du ett formulär från en tabell i Access 2016