Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy do: SQL Server 2016 (13.x) i nowsze wersje
Azure SQL Database
Azure SQL Managed Instance
SQL 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)