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

DATEDIFF() vs DATEDIFF_BIG() dans SQL Server :Quelle est la différence ?

Si vous avez déjà eu besoin de trouver la différence entre deux dates dans SQL Server, vous avez peut-être utilisé le DATEDIFF() une fonction. Cette fonction renvoie la durée entre deux dates en utilisant un datepart spécifié par vous. Par exemple, vous pouvez l'utiliser pour renvoyer le nombre de jours entre la date 1 et la date 2. Vous pouvez également l'obtenir pour renvoyer le nombre de minutes, de secondes, de mois, d'années, etc.

Le DATEDIFF_BIG() fonctionne exactement de la même manière, mais avec une différence subtile :son type de données de retour.

La différence entre ces deux fonctions est donc le type de données de leur valeur de retour.

  • DATEDIFF() renvoie un entier signé (int )
  • DATEDIFF_BIG() renvoie un grand entier signé (bigint )

Dans certains cas, vous n'aurez pas vraiment besoin de renvoyer un bigint Type de données. Cela représente un très grand nombre, et si vous utilisez DATEDIFF() ou DATEDIFF_BIG() ne fera aucune différence (sauf pour les exigences de stockage - int utilise 4 octets, bigint utilise 8 octets).

Cependant, 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.

Dans ce cas, vous devrez effectuer l'une des trois actions suivantes :

  • Utilisez une période plus courte. Par exemple, au lieu d'essayer de renvoyer le nombre de millisecondes en 26 jours, essayez 25.
  • 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.
  • Utilisez le DATEDIFF_BIG() fonction à la place.

Parfois, les deux premières options ne conviennent pas. Si vous avez besoin d'un laps de temps de 26 jours, 25 ne suffiront pas. Et si vous avez besoin d'un horodatage Unix après 2038, vous rencontrerez des problèmes de 2038 si vous utilisez DATEDIFF() .

Dans tous les cas, le DATEDIFF_BIG() La fonction permet une plage de résultats beaucoup plus large que DATEDIFF() .

Exemple

Voici deux exemples pour démontrer à la fois les similitudes et les différences entre DATEDIFF() et DATEDIFF_BIG() .

Même résultat

Voici un exemple où les deux fonctions produisent le même résultat :

DECLARE @date1 datetime2 = SYSDATETIME();  
DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME());
SELECT 
    DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF,
    DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;

Résultat :

DATEDIFF  DATEDIFF_BIG
--------  ------------
1000      1000        

Comme prévu, les deux fonctions renvoient le même résultat. En effet, la valeur de retour est suffisamment petite pour répondre à la fois à bigint et entier Types de données. Tout ce que nous avons fait était de renvoyer le nombre de millisecondes dans 1 seconde.

Résultat différent

Maintenant, voici ce qui se passe si nous augmentons la période à 1000 ans.

Tout d'abord, voici ce qui se passe lorsque nous utilisons DATEDIFF() :

DECLARE @date1 datetime2 = SYSDATETIME();
DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME());
SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;

Résultat :

Error: 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.

Maintenant, voici comment DATEDIFF_BIG() le gère :

DECLARE @date1 datetime2 = SYSDATETIME();
DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME());
SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;

Résultat :

DATEDIFF_BIG  
--------------
31556908800000

Renvoyer le nombre de millisecondes en 1000 ans était trop pour un int , mais ce n'est pas un problème pour un bigint .