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

DATEDIFF_BIG() Przykłady w SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest przekazywanie parametrów do SQL i dlaczego go potrzebuję?

  2. Jak mogę zrobić instrukcję UPDATE z JOIN w SQL Server?

  3. Tworzenie sparametryzowanego VIEW w SQL Server 2008

  4. Ustaw pary klucz/wartość w kontekście sesji w programie SQL Server (sp_set_session_context)

  5. Jakie są przypadki użycia wyboru CHAR nad VARCHAR w SQL?