Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да коригирате грешката „функцията datediff доведе до преливане“ в SQL Server

Тази статия предоставя решение на проблем, който понякога може да срещнете, докато използвате DATEDIFF() функция в SQL Server.

Ако срещнете следната грешка:

Функцията datediff доведе до препълване. Броят на частите от дата, разделящи два екземпляра на дата/час, е твърде голям. Опитайте се да използвате datediff с по-малко точна част от датата.

Това е, защото връщаната стойност е твърде голяма. DATEDIFF() функцията връща резултата си като int тип данни. Причината да получите това съобщение е, че върнатата стойност е твърде голяма за int тип данни. За щастие има лесен начин да поправите това.

Най-бързият и лесен начин да отстраните този проблем е да превключите към DATEDIFF_BIG() функция. Тази функция работи точно като DATEDIFF() , с изключение на това, че неговият тип данни за връщане е подписан bigint . С други думи, може да обработва наистина големи числа.

Пример

Нека видим дали DATEDIFF() може да ни каже колко милисекунди са за хиляда години:

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

Резултат:

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. 

Може би не. Изглежда, че има твърде много милисекунди, за да се поберат в int .

Време е за големите пушки. DATEDIFF_BIG() , направи си нещата...

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

Резултат:

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

Така е по-добре.

Ако все още получавате горното съобщение за грешка, трябва да се опитвате да върнете наистина голям брой. В този случай ще трябва да направите поне едно от следните:

  • Използвайте по-кратък период от време.
  • Използвайте по-малко точна част от дата . Например, вместо да се опитвате да върнете броя на милисекунди, опитайте само с секунди.

Също така имайте предвид, че ще трябва да използвате поне SQL Server 2016, преди да можете да използвате DATEDIFF_BIG() функция.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Нови функции в SQL Server 2017 (Database Engine)

  2. COUNT() срещу COUNT_BIG() в SQL Server:Каква е разликата?

  3. Изтриване на пощенски акаунт в база данни в SQL Server (T-SQL)

  4. Как връщате имената на колоните на таблица?

  5. ExecuteScalar срещу ExecuteNonQuery при връщане на стойност на идентичност