Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment réparer l'erreur "la fonction datediff a entraîné un débordement" dans SQL Server

Cet article fournit une solution à un problème que vous pouvez parfois rencontrer lors de l'utilisation de DATEDIFF() fonction dans SQL Server.

Si vous rencontrez l'erreur suivante :

La fonction datediff a provoqué un débordement. Le nombre de parties de date séparant deux instances de date/heure est trop important. Essayez d'utiliser datediff avec une partie de date moins précise.

C'est parce que la valeur de retour est trop grande. Le DATEDIFF() la fonction renvoie son résultat sous la forme d'un int Type de données. La raison pour laquelle vous avez reçu ce message est que la valeur de retour est trop grande pour le int Type de données. Heureusement, il existe un moyen simple de résoudre ce problème.

Le moyen le plus rapide et le plus simple de résoudre ce problème consiste à passer au DATEDIFF_BIG() une fonction. Cette fonction fonctionne exactement comme DATEDIFF() , sauf que son type de données de retour est un bigint signé . En d'autres termes, il peut gérer de très gros nombres.

Exemple

Voyons si DATEDIFF() peut nous dire combien de millisecondes font mille ans :

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

Résultat :

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. 

Peut être pas. Il semble qu'il y ait trop de millisecondes pour tenir dans un int .

L'heure des gros canons. DATEDIFF_BIG() , faites vos affaires…

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

Résultat :

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

C'est mieux.

Si vous obtenez toujours le message d'erreur ci-dessus, vous devez essayer de renvoyer un vraiment grand nombre. Dans ce cas, vous devrez effectuer au moins l'une des actions suivantes :

  • Utilisez une période plus courte.
  • Utilisez une partie de date moins précise . Par exemple, au lieu d'essayer de renvoyer le nombre de millisecondes, essayez-le avec seulement quelques secondes.

Notez également que vous devez exécuter au moins SQL Server 2016 avant de pouvoir utiliser le DATEDIFF_BIG() fonction.