Udostępnij za pomocą


DATEDIFF_BIG (Transact-SQL)

Dotyczy do: SQL Server 2016 (13.x) i nowsze wersje Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Ta funkcja zwraca liczbę (jako podpisaną dużą liczbę całkowitą) określonych granic elementów datepart przekraczanych między określoną datą początkową a datą końcową.

Zobacz Typy i funkcje danych daty i godziny (Transact-SQL), aby zapoznać się z omówieniem wszystkich typów danych i funkcji daty i godziny języka Transact-SQL.

Transact-SQL konwencje składni

Składnia

DATEDIFF_BIG ( datepart , startdate , enddate )  

Arguments

datepart
Część parametru startdate i enddate , która określa typ przekraczania granicy.

Uwaga / Notatka

DATEDIFF_BIG nie zaakceptuje wartości elementów datepart ze zmiennych zdefiniowanych przez użytkownika ani jako ciągów cytowanych.

Ta tabela zawiera listę wszystkich prawidłowych nazw argumentów i skrótów elementów datepart .

nazwa składnika datepart skrót datypart
rok yy, yyyy
ćwiartka qq, q
miesiąc mm, m
dayofyear dy, y
dzień dd, d
tydzień WK, WW
godzina hh
minuta mi, n
sekunda SS, S
milisekunda Ms
mikrosekundy Mcs
Nanosekund Ns

Uwaga / Notatka

Każda określona nazwa i skróty dla tej nazwy elementu datepart będą zwracać tę samą wartość.

data rozpoczęcia
Wyrażenie, które może rozpoznać jedną z następujących wartości:

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

W przypadku datyDATEDIFF_BIG zaakceptuje wyrażenie kolumny, wyrażenie, literał ciągu lub zmienną zdefiniowaną przez użytkownika. Wartość literału ciągu musi być rozpoznawana jako data/godzina. Użyj czterocyfrowych lat, aby uniknąć problemów z niejednoznacznością. DATEDIFF_BIG odejmuje pracę początkową od enddate. Aby uniknąć niejednoznaczności, użyj czterech cyfr lat. Aby uzyskać informacje o dwóch cyfrowych latach , zobacz Konfigurowanie opcji konfiguracji serwera o dwóch cyfrach.

enddate
Zobacz startdate.

Zwracany typ

Podpisany bigint

Wartość zwracana

Zwraca różnicę bigint między początkową i enddate wyrażoną w granicach ustawionych przez element datepart.

Dla wartości zwracanej z zakresu dla bigint (-9,223,372,036,854,775,808 do 9,223,372,036,854,775,807) DATEDIFF_BIG zwraca błąd. W przeciwieństwie do metody , która zwraca wartość int i w związku z tym może przepełnić się minutą lub wyższą, DATEDIFF_BIG może przepełnić się tylko w przypadku użycia dokładności nanosekund, gdzie różnica między enddate i startdate wynosi ponad 292 lata, 3 miesiące, 10 dni, 23 godziny, 47 minut i 16,8547758 sekund.

Jeśli parametr startdate i enddate mają przypisaną tylko wartość godziny, a element datepart nie jest elementyem datapart godziny, DATEDIFF_BIG zwraca wartość 0.

DATEDIFF_BIG Używa składnika przesunięcia strefy czasowej startdate lub enddate , aby obliczyć wartość zwracaną.

W przypadku wartości smalldatetime używanej dla wartości startdate lub enddate zawsze ustawia sekundy i milisekundy na 0 w wartości zwracanej, DATEDIFF_BIG ponieważ parametr smalldatetime ma tylko dokładność do minuty.

Jeśli tylko wartość godziny jest przypisana do zmiennej typu danych daty, DATEDIFF_BIG ustawia wartość brakującej części daty na wartość domyślną: 1900-01-01. Jeśli tylko wartość daty jest przypisana do zmiennej typu danych godziny lub daty, DATEDIFF_BIG ustawia wartość brakującej części godziny na wartość domyślną: 00:00:00. Jeśli data początkowa lub data końcowa mają tylko część czasową, a druga tylko część daty, DATEDIFF_BIG ustawia brakujące części godziny i daty na wartości domyślne.

Jeśli parametr startdate i enddate mają różne typy danych daty, a jeden ma więcej części czasu lub ułamkowe sekundy precyzji niż druga, DATEDIFF_BIG ustawia brakujące części drugiej do 0.

granice części daty

Poniższe instrukcje mają te same wartości startdate i te same wartości enddate . Daty te sąsiadują i różnią się w czasie o sto nanosekund (0000001 sekundy). Różnica między wartością startdate i enddate w każdej instrukcji przekracza jeden kalendarz lub granicę godziny części daty. Każda instrukcja zwraca wartość 1. Jeśli parametr startdate i enddate mają różne wartości roku, ale mają te same wartości tygodnia kalendarzowego, DATEDIFF_BIG funkcja zwróci wartość 0 dla tygodniadatepart.

SELECT DATEDIFF_BIG(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

Uwagi

Użyj DATEDIFF_BIG w klauzulach SELECT <list>, WHERE, HAVINGGROUP BYi ORDER BY .

DATEDIFF_BIG niejawnie rzutuje literały ciągu jako typ datetime2 . Oznacza to, że DATEDIFF_BIG nie obsługuje formatu YDM, gdy data jest przekazywana jako ciąg. Aby użyć formatu YDM, należy jawnie rzutować ciąg na typ datetime lub smalldatetime .

Określanie SET DATEFIRST nie ma wpływu na .DATEDIFF_BIG DATEDIFF_BIG zawsze używa niedzieli jako pierwszego dnia tygodnia, aby zapewnić, że funkcja działa w sposób deterministyczny.

DATEDIFF_BIG może przepełnić się nanosekundą , jeśli różnica między enddate i startdate zwraca wartość, która jest poza zakresem dla bigint.

Przykłady

Określanie kolumn dla daty rozpoczęcia i daty zakończenia

W tym przykładzie użyto różnych typów wyrażeń jako argumentów dla parametrów startdate i enddate . Oblicza liczbę granic dnia przekraczanych między datami w dwóch kolumnach tabeli.

CREATE TABLE dbo.Duration  
    (startDate datetime2, endDate datetime2);  
    
INSERT INTO dbo.Duration(startDate,endDate)  
    VALUES('2007-05-06 12:10:09', '2007-05-07 12:10:09');  
    
SELECT DATEDIFF_BIG(day, startDate, endDate) AS 'Duration'  
    FROM dbo.Duration;  
-- Returns: 1  

Znajdowanie różnicy między wartościami startdate i enddate jako ciągi części daty

DECLARE @date1 DATETIME2, @date2 DATETIME2, @result VARCHAR(100)
DECLARE @years BIGINT, @months BIGINT, @days BIGINT, @hours BIGINT, @minutes BIGINT, @seconds BIGINT, @milliseconds BIGINT

SET @date1 = '0001-01-01 00:00:00.00000000'
SET @date2 = '2018-12-12 07:08:01.12345678'

SELECT @years = DATEDIFF(yy, @date1, @date2)
IF DATEADD(yy, -@years, @date2) < @date1 
SELECT @years = @years-1
SET @date2 = DATEADD(yy, -@years, @date2)

SELECT @months = DATEDIFF(mm, @date1, @date2)
IF DATEADD(mm, -@months, @date2) < @date1 
SELECT @months=@months-1
SET @date2= DATEADD(mm, -@months, @date2)

SELECT @days=DATEDIFF(dd, @date1, @date2)
IF DATEADD(dd, -@days, @date2) < @date1 
SELECT @days=@days-1
SET @date2= DATEADD(dd, -@days, @date2)

SELECT @hours=DATEDIFF(hh, @date1, @date2)
IF DATEADD(hh, -@hours, @date2) < @date1 
SELECT @hours=@hours-1
SET @date2= DATEADD(hh, -@hours, @date2)

SELECT @minutes=DATEDIFF(mi, @date1, @date2)
IF DATEADD(mi, -@minutes, @date2) < @date1 
SELECT @minutes=@minutes-1
SET @date2= DATEADD(mi, -@minutes, @date2)

SELECT @seconds=DATEDIFF(s, @date1, @date2)
IF DATEADD(s, -@seconds, @date2) < @date1 
SELECT @seconds=@seconds-1
SET @date2= DATEADD(s, -@seconds, @date2)

SELECT @milliseconds=DATEDIFF(ms, @date1, @date2)

SELECT @result= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','')
     + ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','')    
     + ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','')
     + ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','')
     + ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','')
     + ISNULL(' ' + CAST(@seconds AS VARCHAR(10)) 
          + CASE WHEN @milliseconds > 0 THEN '.' + CAST(@milliseconds AS VARCHAR(10)) 
               ELSE '' END 
          + ' seconds','')

SELECT @result

Oto zestaw wyników.

2017 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds

Zobacz bardziej powiązane przykłady w artykule DATEDIFF (Transact-SQL).

Zobacz także

RZUTOWANIE i konwertowanie (Transact-SQL)
DATEDIFF (Transact-SQL)