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

DATEDIFF() Przykłady w SQL Server

W SQL Server możesz użyć funkcji T-SQL DATEDIFF() funkcja zwracająca różnicę między dwiema datami/godzinami. Działa na każdym wyrażeniu, które można rozwiązać do czasudatasmalldatetimedata i godzinadata/godzina2 lub przesunięcie daty i godziny wartość.

Ten artykuł zawiera przykłady DATEDIFF() funkcja w SQL Server.

Składnia

Po pierwsze, oto składnia:

DATEDIFF ( 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.

Działa to tak, że zwraca liczbę (jako liczbę całkowitą ze znakiem) określonej datapart granice przekroczone między określoną data rozpoczęcia i data końcowa .

Przykład 1

Oto podstawowy przykład, w którym dowiadujemy się o liczbie dni między dwiema datami:

SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;

Wynik:

+----------+
| Result   |
|----------|
| 365      |
+----------+

Przykład 2

Oto kolejny przykład, w którym deklaruję dwie zmienne i przypisuję im dwie różne daty (używam DATEADD() dodać 1 rok do pierwszej daty). Następnie używam DATEDIFF() aby zwrócić różne części daty dla tej daty:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 1, @date1);
SELECT 
    DATEDIFF( year, @date1, @date2 ) AS Years,
    DATEDIFF( quarter, @date1, @date2 ) AS Quarters,
    DATEDIFF( month, @date1, @date2 ) AS Months,
    DATEDIFF( week, @date1, @date2 ) AS Weeks,
    DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear,
    DATEDIFF( day, @date1, @date2 ) AS Days;

Wynik:

+---------+------------+----------+---------+-------------+--------+
| Years   | Quarters   | Months   | Weeks   | DayOfYear   | Days   |
|---------+------------+----------+---------+-------------+--------|
| 1       | 4          | 12       | 53      | 366         | 366    |
+---------+------------+----------+---------+-------------+--------+

Przykład 3

Jak wspomniano, możesz również zwrócić części czasu między datami. Oto przykład zwracania liczby godzin, minut i sekund między wartościami daty/czasu:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1);
SELECT 
    DATEDIFF( hour, @date1, @date2 ) AS Hours,
    DATEDIFF( minute, @date1, @date2 ) AS Minutes,
    DATEDIFF( second, @date1, @date2 ) AS Seconds;

Wynik:

+---------+-----------+-----------+
| Hours   | Minutes   | Seconds   |
|---------+-----------+-----------|
| 1       | 60        | 3600      |
+---------+-----------+-----------+

Przykład 4

A oto przykład pobrania liczby milisekund, mikrosekund i nanosekund między dwiema wartościami daty/czasu:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1);
SELECT    
    DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
    DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
    DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

Wynik:

+----------------+----------------+---------------+
| Milliseconds   | Microseconds   | Nanoseconds   |
|----------------+----------------+---------------|
| 1              | 1000           | 1000000       |
+----------------+----------------+---------------+

Przykład 5 – Błąd!

Jeśli spróbujesz zrobić coś ekstremalnego, na przykład zwrócić liczbę nanosekund na 100 lat, otrzymasz błąd. Dzieje się tak, ponieważ DATEDIFF() zwraca int wartość, a w ciągu 100 lat jest więcej nanosekund niż int typ danych może obsłużyć.

Oto, co się stanie, jeśli spróbujesz to zrobić:

DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 100, @date1);
SELECT    
    DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
    DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
    DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;

Wynik:

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. 

Na szczęście, jeśli naprawdę musisz dowiedzieć się, ile nanosekund trwa 100 lat, możesz użyć funkcji DATEDIFF_BIG() funkcja zamiast. Ta funkcja zwraca podpisany bigin typ danych, który pozwala zwracać znacznie większe wartości niż DATEDIFF() może.

Przykład 6 – uzyskiwanie dziwnych wyników?

Wyniki uzyskane z DATEDIFF() może czasami wyglądać zupełnie niepoprawnie, jeśli nie wiesz, jak faktycznie działa ta funkcja.

Na przykład:

DECLARE 
  @startdate datetime2 = '2016-01-01  00:00:00.0000000', 
  @enddate datetime2 = '2016-12-31 23:59:59.9999999';
SELECT 
  DATEDIFF(day, @startdate, @enddate) Days,
  DATEDIFF(year, @startdate, @enddate) Years;

Wynik:

+--------+---------+
| Days   | Years   |
|--------+---------|
| 365    | 0       |
+--------+---------+

Jeśli nie wiesz, jak DATEDIFF() faktycznie działa, ten wynik może wyglądać tak źle, że można by wybaczyć założenie, że to błąd. Ale to nie jest błąd.

Sprawdź DATEDIFF() zwraca nieprawidłowe wyniki w programie SQL Server? Przeczytaj to. aby zobaczyć ten przykład i inne przypadki, w których wyniki mogą wyglądać zupełnie niewłaściwie, ale są całkowicie poprawne (i wyjaśnienie, dlaczego wyglądają tak, jak wyglądają).

Jeden z przykładów na tej stronie jest prawdopodobnie wart ponownego przytoczenia w tym miejscu. DATEDIFF() faktycznie ignoruje Twój SET DATEFIRST wartość. Może to skutkować nieoczekiwanymi rezultatami, zwłaszcza jeśli żyjesz w kulturze, w której niedziela nie jest pierwszym dniem tygodnia. Sprawdź to obejście dla DATEDIFF() Ignorowanie SET DATEFIRST w SQL Server, jeśli uważasz, że może to na Ciebie wpłynąć.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizuj statystyki SQL Server za pomocą planu konserwacji bazy danych

  2. Kiedy używać indeksów klastrowych lub nieklastrowych w programie SQL Server

  3. Alerty agenta serwera SQL

  4. Zaktualizuj kolumnę licznika z danych w innej tabeli

  5. T-SQL:w przeciwieństwie do łączenia ciągów — jak podzielić ciąg na wiele rekordów