W SQL Server możesz użyć DATEDIFF_BIG()
zamiast funkcji DATEDIFF()
funkcja, jeśli oczekujesz, że zwracana wartość będzie naprawdę duża. Na przykład, jeśli próbujesz dowiedzieć się, ile milisekund wynosi 1000 lat, pojawi się błąd.
To dlatego, że DATEDIFF()
zwraca int typ danych, a wynik jest zbyt duży dla tego typu danych. Z drugiej strony DATEDIFF_BIG()
funkcja zwraca podpisany bigin typ danych, co oznacza, że możesz go użyć do zwrócenia znacznie większych wartości. Innymi słowy, możesz używać znacznie większego zakresu dat.
Poza tym nie ma tak naprawdę żadnej różnicy między tymi dwiema funkcjami.
Artykuł zawiera przykłady użycia DATEDIFF_BIG()
funkcja w SQL Server.
Składnia
Po pierwsze, oto składnia:
DATEDIFF_BIG ( datepart , startdate , enddate )
Gdzie datapart to część daty, którą chcesz porównać. data rozpoczęcia to pierwsza data i data końcowa to data zakończenia.
Funkcja odejmuje data rozpoczęcia od data zakończenia .
Działa to tak, że zwraca liczbę (jako dużą liczbę całkowitą ze znakiem) określonej datapart granice przekroczone między określoną data rozpoczęcia i data końcowa .
Jest to dokładnie ta sama składnia, która jest używana w funkcji DATEDIFF()
funkcja.
Przykład 1
To jest podstawowy przykład pokazujący, jak to działa.
SELECT DATEDIFF_BIG(day, '0001-01-01', '9002-01-01') AS Result;
Wynik:
+----------+ | Result | |----------| | 3287547 | +----------+
Zauważ, że w tym przypadku mogliśmy użyć DATEDIFF()
, ponieważ wynik nie jest zbyt duży dla liczby całkowitej.
Przykład 2
Oto przykład, w którym zwracamy różnicę różnych części daty z dwóch dat. W tym przypadku deklaruję dwie zmienne i przypisuję im dwie różne daty (używam funkcji DATEADD()
funkcja dodawania 1000 lat do pierwszej daty):
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;
Wynik:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1000 | 4000 | 12000 | 52178 | 365243 | 365243 | +---------+------------+----------+---------+-------------+--------+
Ponownie, mogliśmy użyć DATEDIFF()
, ponieważ żaden z wyników nie jest zbyt duży dla liczby całkowitej.
Przykład 3
W tym przykładzie zwracamy godziny, minuty i sekundy między dwiema datami:
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;
Wynik:
+---------+-----------+-------------+ | Hours | Minutes | Seconds | |---------+-----------+-------------| | 8765832 | 525949920 | 31556995200 | +---------+-----------+-------------+
Teraz jesteśmy w punkcie, w którym DATEDIFF()
zwróciłby błąd. Liczba sekund jest zbyt duża dla int (ale nie dla dużych ).
Przykład 4
I na koniec, oto przykład z milisekundami, mikrosekundami i nanosekundami:
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;
Wynik:
+----------------+------------------+---------------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+------------------+---------------------| | 3155760000000 | 3155760000000000 | 3155760000000000000 | +----------------+------------------+---------------------+
W tym przypadku wyraźnie widzimy korzyści, które DATEDIFF_BIG()
ma ponad DATEDIFF()
. DATEDIFF()
przewróciłby się we wszystkich trzech.