Тази статия предоставя решение на проблем, който понякога може да срещнете, докато използвате 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()
функция.