sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo corregir el error "la función datediff resultó en un desbordamiento" en SQL Server

Este artículo proporciona una solución a un problema que puede encontrar ocasionalmente al usar DATEDIFF() función en SQL Server.

Si encuentra el siguiente error:

La función dateiff resultó en un desbordamiento. El número de partes de fecha que separan dos instancias de fecha/hora es demasiado grande. Trate de usar dateiff con una parte de fecha menos precisa.

Es porque el valor de retorno es demasiado grande. El DATEDIFF() la función devuelve su resultado como un int tipo de datos. La razón por la que recibió este mensaje es que el valor devuelto es demasiado grande para el int tipo de datos. Afortunadamente, hay una manera fácil de arreglar esto.

La forma más rápida y sencilla de solucionar este problema es cambiar a DATEDIFF_BIG() función. Esta función funciona exactamente como DATEDIFF() , excepto que su tipo de datos de retorno es un bigint firmado . En otras palabras, puede manejar números realmente grandes.

Ejemplo

A ver si DATEDIFF() puede decirnos cuántos milisegundos hay en mil años:

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

Resultado:

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. 

Tal vez no. Parece que hay demasiados milisegundos para caber en un int .

Hora de las armas grandes. DATEDIFF_BIG() , haz tus cosas…

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

Resultado:

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

Eso es mejor.

Si aún recibe el mensaje de error anterior, debe estar intentando devolver un realmente Número grande. En ese caso, deberá realizar al menos una de las siguientes acciones:

  • Use un período de tiempo más corto.
  • Use una datepart menos precisa . Por ejemplo, en lugar de intentar devolver la cantidad de milisegundos, inténtelo con solo segundos.

También tenga en cuenta que deberá ejecutar al menos SQL Server 2016 antes de poder usar DATEDIFF_BIG() función.