sql >> Database >  >> RDS >> Sqlserver

Hoe te repareren van de "datediff-functie resulteerde in een overloop" Fout in SQL Server

Dit artikel biedt een oplossing voor een probleem dat u af en toe tegenkomt tijdens het gebruik van de DATEDIFF() functie in SQL Server.

Als u de volgende fout tegenkomt:

De datediff-functie zorgde voor een overflow. Het aantal dateparts dat twee datum/tijd-instanties van elkaar scheidt, is te groot. Probeer datediff te gebruiken met een minder nauwkeurig datepart.

Dit komt omdat de retourwaarde te groot is. De DATEDIFF() functie retourneert het resultaat als een int data type. De reden dat je dit bericht krijgt is dat de retourwaarde te groot is voor de int data type. Gelukkig is er een eenvoudige manier om dit op te lossen.

De snelste en gemakkelijkste manier om dit probleem op te lossen, is door over te schakelen naar de DATEDIFF_BIG() functie. Deze functie werkt precies zoals DATEDIFF() , behalve dat het retourgegevenstype een ondertekende bigint . is . Met andere woorden, het kan echt grote aantallen aan.

Voorbeeld

Laten we eens kijken of DATEDIFF() kan ons vertellen hoeveel milliseconden er in duizend jaar zijn:

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

Resultaat:

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. 

Misschien niet. Het lijkt erop dat er te veel milliseconden zijn om in een int . te passen .

Tijd voor de grote kanonnen. DATEDIFF_BIG() , doe je ding...

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

Resultaat:

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

Dat is beter.

Als je nog steeds de bovenstaande foutmelding krijgt, moet je proberen een echt . terug te sturen groot aantal. In dat geval moet u ten minste een van de volgende dingen doen:

  • Gebruik een kortere periode.
  • Gebruik een minder nauwkeurige datepart . Bijvoorbeeld, in plaats van te proberen het aantal milliseconden terug te geven, probeer het met slechts enkele seconden.

Houd er ook rekening mee dat u minimaal SQL Server 2016 moet gebruiken voordat u de DATEDIFF_BIG() kunt gebruiken functie.


  1. Het ProxySQL-auditlogboek begrijpen

  2. Online schema-upgrade in MySQL Galera-cluster met behulp van de RSU-methode

  3. Wat is de volgorde van records in een tabel met een samengestelde primaire sleutel

  4. Polymorfisme in SQL-databasetabellen?