Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

DATEDIFF() vs DATEDIFF_BIG() w SQL Server:jaka jest różnica?

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 .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak programowo zmienić wartości kolumn tożsamości?

  2. Nie można połączyć się z serwerem SQL za pomocą PHP

  3. Poprawka:„Oświadczenie BACKUP LOG jest niedozwolone, gdy model odzyskiwania jest PROSTY” w SQL Server (i SQL Edge)

  4. Jak zaimportować plik Excel do SQL Server?

  5. Jak działa SET ROWCOUNT w SQL Server