В SQL Server можете да използвате DATEDIFF_BIG()
функция вместо DATEDIFF()
функция, ако очаквате върнатата стойност да бъде наистина голяма. Например, ако се опитвате да разберете колко милисекунди са на 1000 години, ще получите грешка.
Това е така, защото DATEDIFF()
връща int тип данни и резултатът е твърде голям, за да може този тип данни да се обработва. От друга страна, DATEDIFF_BIG()
функцията връща подписан bigint тип данни, което означава, че можете да го използвате за връщане на много по-големи стойности. С други думи, можете да използвате с много по-голям диапазон от дати.
Освен това, всъщност няма разлика между двете функции.
Статията предоставя примери за използване на DATEDIFF_BIG()
функция в SQL Server.
Синтаксис
Първо, ето синтаксиса:
DATEDIFF_BIG ( datepart , startdate , enddate )
Където datepart е частта от датата, която искате да сравните. начална дата е първата и крайната дата е крайната дата.
Функцията изважда начална дата от крайна дата .
Начинът, по който работи е, че връща броя (като подписана голяма целочислена стойност) на посочения datepart прекосени граници между посочената начална дата и крайна дата .
Това е точно същият синтаксис, който се използва с DATEDIFF()
функция.
Пример 1
Това е основен пример за демонстриране как работи.
SELECT DATEDIFF_BIG(day, '0001-01-01', '9002-01-01') AS Result;
Резултат:
+----------+ | Result | |----------| | 3287547 | +----------+
Имайте предвид, че в този случай бихме могли да използваме DATEDIFF()
, тъй като резултатът не е твърде голям за цяло число.
Пример 2
Ето пример, в който връщаме разликата на различни части от дати от две дати. В този случай декларирам две променливи и им присвоявам две различни дати (използвам DATEADD()
функция за добавяне на 1000 години към първата дата):
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1000, @date1); SELECT DATEDIFF_BIG( year, @date1, @date2 ) AS Years, DATEDIFF_BIG( quarter, @date1, @date2 ) AS Quarters, DATEDIFF_BIG( month, @date1, @date2 ) AS Months, DATEDIFF_BIG( week, @date1, @date2 ) AS Weeks, DATEDIFF_BIG( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF_BIG( day, @date1, @date2 ) AS Days;
Резултат:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1000 | 4000 | 12000 | 52178 | 365243 | 365243 | +---------+------------+----------+---------+-------------+--------+
Отново бихме могли да използваме DATEDIFF()
, тъй като нито един от резултатите не е твърде голям за цяло число.
Пример 3
В този пример връщаме часовете, минутите и секундите между две дати:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1000, @date1); SELECT DATEDIFF_BIG( hour, @date1, @date2 ) AS Hours, DATEDIFF_BIG( minute, @date1, @date2 ) AS Minutes, DATEDIFF_BIG( second, @date1, @date2 ) AS Seconds;
Резултат:
+---------+-----------+-------------+ | Hours | Minutes | Seconds | |---------+-----------+-------------| | 8765832 | 525949920 | 31556995200 | +---------+-----------+-------------+
Сега сме на мястото, където DATEDIFF()
би върнал грешка. Броят на секундите е твърде голям за int (но не за по-голямо) ).
Пример 4
И накрая, ето пример с милисекунди, микросекунди и наносекунди:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 100, @date1); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF_BIG( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF_BIG( nanosecond, @date1, @date2 ) AS Nanoseconds;
Резултат:
+----------------+------------------+---------------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+------------------+---------------------| | 3155760000000 | 3155760000000000 | 3155760000000000000 | +----------------+------------------+---------------------+
В този случай можем ясно да видим ползата от DATEDIFF_BIG()
има над DATEDIFF()
. DATEDIFF()
щеше да падне и трите.