Ако някога сте имали нужда да намерите разликата между две дати в SQL Server, може да сте използвали DATEDIFF()
функция. Тази функция връща времето между две дати с помощта на datepart посочени от вас. Например, можете да го използвате, за да върнете броя на дните между дата 1 и дата 2. Можете също да го накарате да връща броя минути, секунди, месеци, години и т.н.
DATEDIFF_BIG()
функцията работи точно по същия начин, но с една фина разлика:нейният тип данни за връщане.
Така че разликата между тези две функции е типът данни на тяхната връщана стойност.
DATEDIFF()
връща цяло число със знак (int )DATEDIFF_BIG()
връща голямо цяло число със знак (bigint )
В някои случаи няма да имате много нужда да връщате bigint тип данни. Това представлява много голямо число и дали използвате DATEDIFF()
или DATEDIFF_BIG()
няма да има разлика (с изключение на изискванията за съхранение – int използва 4 байта, големи използва 8 байта).
Ако обаче срещнете следната грешка:
Функцията datediff доведе до препълване. Броят на частите от дата, разделящи два екземпляра на дата/час, е твърде голям. Опитайте се да използвате datediff с по-малко точна част от датата.
Това е, защото връщаната стойност е твърде голяма.
В този случай ще трябва да направите едно от трите неща:
- Използвайте по-кратък период от време. Например, вместо да се опитвате да върнете броя на милисекунди за 26 дни, опитайте 25.
- Използвайте по-малко точна част от дата . Например, вместо да се опитвате да върнете броя на милисекунди, опитайте само с секунди.
- Използвайте
DATEDIFF_BIG()
функция вместо това.
Понякога първите две опции не са подходящи. Ако имате нужда от времеви интервал от 26 дни, 25 няма да го съкрати. И ако имате нужда от времева марка на Unix след 2038 г., ще срещнете проблеми 2038, ако използвате DATEDIFF()
.
Във всеки случай, DATEDIFF_BIG()
функцията позволява много по-голям обхват от резултати от DATEDIFF()
.
Пример
Ето два примера за демонстриране както на приликите, така и на разликите между DATEDIFF()
и DATEDIFF_BIG()
.
Същият резултат
Ето пример, при който и двете функции дават един и същ резултат:
DECLARE @date1 datetime2 =SYSDATETIME(); ДЕКЛАРИРАНЕ @date2 datetime2 =DATEADD(second, 1, SYSDATETIME());SELECT DATEDIFF( милисекунда, @date1, @date2 ) КАТО DATEDIFF, DATEDIFF_BIG( милисекунда, @date1, @date2 ) КАТО DATEDIFF>_BIG;Резултат:
DATEDIFF DATEDIFF_BIG-------- ------------1000 1000Както се очаква, и двете функции връщат един и същ резултат. Това е така, защото връщаната стойност е достатъчно малка, за да обслужи и двете големи ивх типове данни. Всичко, което направихме, беше да върнем броя на милисекунди за 1 секунда.
Различен резултат
Ето какво ще се случи, ако увеличим времевата рамка до 1000 години.
Първо, ето какво се случва, когато използваме
DATEDIFF()
:DECLARE @date1 datetime2 =SYSDATETIME();DECLARE @date2 datetime2 =DATEADD(година, 1000, SYSDATETIME());SELECT DATEDIFF( милисекунда, @date1, @date2 ) КАТО DATEDIFF;Резултат:
Грешка:Функцията datediff доведе до препълване. Броят на частите от дата, разделящи два екземпляра на дата/час, е твърде голям. Опитайте се да използвате datediff с по-малко точна част от датата.Сега, ето как
DATEDIFF_BIG()
се справя с това:DECLARE @date1 datetime2 =SYSDATETIME();DECLARE @date2 datetime2 =DATEADD(година, 1000, SYSDATETIME());SELECT DATEDIFF_BIG( милисекунда, @date1, @date2 ) КАТО DATEDIFF_BIG;Резултат:
DATEDIFF_BIG --------------31556908800000Връщането на броя на милисекунди за 1000 години беше твърде много за int , но това не е проблем за големи .