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

DATEDIFF() vs DATEDIFF_BIG() en SQL Server:¿Cuál es la diferencia?

Si alguna vez ha necesitado encontrar la diferencia entre dos fechas en SQL Server, es posible que haya utilizado DATEDIFF() función. Esta función devuelve la cantidad de tiempo entre dos fechas usando un datepart especificado por usted. Por ejemplo, podría usarlo para devolver la cantidad de días entre la fecha 1 y la fecha 2. También puede hacer que devuelva la cantidad de minutos, segundos, meses, años, etc.

El DATEDIFF_BIG() funciona exactamente de la misma manera, pero con una sutil diferencia:su tipo de datos de retorno.

Entonces, la diferencia entre estas dos funciones es el tipo de datos de su valor devuelto.

  • DATEDIFF() devuelve un entero con signo (int )
  • DATEDIFF_BIG() devuelve un entero grande con signo (bigint )

En algunos casos, no tendrá mucha necesidad de devolver un bigint tipo de datos. Esto representa un número muy grande, y si usa DATEDIFF() o DATEDIFF_BIG() no hará ninguna diferencia (excepto por los requisitos de almacenamiento:int usa 4 bytes, bigint utiliza 8 bytes).

Sin embargo, 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 devuelto es demasiado grande.

En este caso, deberá hacer una de estas tres cosas:

  • Use un período de tiempo más corto. Por ejemplo, en lugar de intentar devolver la cantidad de milisegundos en 26 días, intente con 25.
  • Use una datepart menos precisa . Por ejemplo, en lugar de intentar devolver la cantidad de milisegundos, inténtelo con solo segundos.
  • Utilice el DATEDIFF_BIG() en su lugar.

A veces las dos primeras opciones no son adecuadas. Si necesita un lapso de tiempo de 26 días, 25 no será suficiente. Y si necesita una marca de tiempo de Unix posterior a 2038, encontrará problemas de 2038 si usa DATEDIFF() .

En cualquier caso, el DATEDIFF_BIG() La función permite un rango de resultados mucho más amplio que DATEDIFF() .

Ejemplo

Aquí hay dos ejemplos para demostrar tanto las similitudes como las diferencias entre DATEDIFF() y DATEDIFF_BIG() .

Mismo resultado

Aquí hay un ejemplo donde ambas funciones producen el mismo resultado:

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;

Resultado:

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

Como era de esperar, ambas funciones devuelven el mismo resultado. Esto se debe a que el valor de retorno es lo suficientemente pequeño como para atender tanto a bigint y int tipos de datos. Todo lo que hicimos fue devolver la cantidad de milisegundos en 1 segundo.

Resultado diferente

Ahora, esto es lo que sucede si aumentamos el marco de tiempo a 1000 años.

Primero, esto es lo que sucede cuando usamos DATEDIFF() :

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

Resultado:

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.

Ahora, así es como DATEDIFF_BIG() lo maneja:

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

Resultado:

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

Devolver el número de milisegundos en 1000 años fue demasiado para un int , pero no es un problema para un bigint .