Jeśli kiedykolwiek musiałeś znaleźć różnicę między dwiema datami w SQL Server, mogłeś użyć DATEDIFF()
funkcjonować. Ta funkcja zwraca ilość czasu między dwiema datami za pomocą datapart określone przez Ciebie. Możesz na przykład użyć go do zwrócenia liczby dni między datą 1 a datą 2. Możesz również uzyskać zwrócenie liczby minut, sekund, miesięcy, lat itp.
DATEDIFF_BIG()
funkcja działa dokładnie w ten sam sposób, ale z jedną subtelną różnicą:zwraca typ danych.
Tak więc różnica między tymi dwiema funkcjami polega na typie danych ich wartości zwracanej.
DATEDIFF()
zwraca liczbę całkowitą ze znakiem (int )DATEDIFF_BIG()
zwraca dużą liczbę całkowitą ze znakiem (duża )
W niektórych przypadkach nie będziesz musiał zwracać dużego typ danych. To reprezentuje bardzo dużą liczbę i czy używasz DATEDIFF()
lub DATEDIFF_BIG()
nie będzie miało znaczenia (z wyjątkiem wymagań dotyczących przechowywania – int używa 4 bajtów, bigint używa 8 bajtów).
Jeśli jednak napotkasz następujący błąd:
Funkcja datediff spowodowała przepełnienie. Liczba części daty oddzielających dwa wystąpienia daty/godziny jest zbyt duża. Spróbuj użyć datediff z mniej dokładną częścią daty.
Dzieje się tak, ponieważ zwracana wartość jest zbyt duża.
W takim przypadku musisz zrobić jedną z trzech rzeczy:
- Użyj krótszego okresu. Na przykład zamiast zwracać liczbę milisekund w 26 dniach, spróbuj 25.
- Użyj mniej dokładnej części daty . Na przykład, zamiast zwracać liczbę milisekund, wypróbuj tylko sekundy.
- Użyj
DATEDIFF_BIG()
funkcja zamiast.
Czasami dwie pierwsze opcje nie są odpowiednie. Jeśli potrzebujesz przedziału czasowego 26 dni, 25 go nie skróci. A jeśli potrzebujesz znacznika czasu Unix po 2038, napotkasz problemy 2038, jeśli użyjesz DATEDIFF()
.
W każdym razie DATEDIFF_BIG()
funkcja pozwala na znacznie większy zakres wyników niż DATEDIFF()
.
Przykład
Oto dwa przykłady pokazujące zarówno podobieństwa, jak i różnice między DATEDIFF()
i DATEDIFF_BIG()
.
Ten sam wynik
Oto przykład, w którym obie funkcje dają ten sam wynik:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF, DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Wynik:
DATEDIFF DATEDIFF_BIG -------- ------------ 1000 1000
Zgodnie z oczekiwaniami obie funkcje zwracają ten sam wynik. Dzieje się tak, ponieważ zwracana wartość jest wystarczająco mała, aby zaspokoić zarówno duże i int typy danych. Zwróciliśmy tylko liczbę milisekund w ciągu 1 sekundy.
Inny wynik
Oto, co się stanie, jeśli zwiększymy ramy czasowe do 1000 lat.
Po pierwsze, oto co się dzieje, gdy używamy DATEDIFF()
:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;
Wynik:
Error: 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.
Oto jak DATEDIFF_BIG()
radzi sobie z tym:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Wynik:
DATEDIFF_BIG -------------- 31556908800000
Zwrócenie liczby milisekund w ciągu 1000 lat to za dużo dla int , ale to nie problem dla dużego .