Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för: SQL Server 2016 (13.x) och senare versioner
Azure SQL Database
Azure SQL Managed Instance
Den här funktionen returnerar antalet (som ett signerat stort heltalsvärde) för de angivna datepart-gränserna som korsas mellan angivet startdatum och slutdatum.
Se Datatyper och funktioner för datum och tid (Transact-SQL) för en översikt över alla datatyper och funktioner för Transact-SQL-datum och tid.
Transact-SQL syntaxkonventioner
Syntax
DATEDIFF_BIG ( datepart , startdate , enddate )
Arguments
datepart
Den del av startdate och enddate som anger vilken typ av gräns som korsas.
Anmärkning
DATEDIFF_BIG accepterar inte datepart-värden från användardefinierade variabler eller som angivna strängar.
I den här tabellen visas alla giltiga datepart-argumentnamn och förkortningar.
| datepart name | datepart-förkortning |
|---|---|
| år | yyy, yyyyy |
| fjärdedel | qq, q |
| månad | mm, m |
| dayofyear | dy, y |
| dag | dd, d |
| vecka | wk, ww |
| timme | hh |
| minut | mi, n |
| andra | ss, s |
| millisekund | Ms |
| mikrosekund | Mcs |
| nanosekund | Ns |
Anmärkning
Varje specifikt datepart-namn och förkortningar för det datepart-namnet returnerar samma värde.
startdate
Ett uttryck som kan matcha något av följande värden:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
För datumDATEDIFF_BIG accepterar ett kolumnuttryck, uttryck, strängliteral eller användardefinierad variabel. Ett strängliteralt värde måste matchas till en datetime. Använd fyrsiffriga år för att undvika tvetydighetsproblem.
DATEDIFF_BIG subtraherar startdate från enddate. Använd fyrsiffriga år för att undvika tvetydighet. Mer information om tvåsiffriga år finns i Konfigurera det tvåsiffriga alternativet för serverkonfiguration .
enddate
Se startdate.
Returtyp
Signerad bigint
Returvärde
Returnerar den stora skillnaden mellan startdate och enddate, uttryckt i gränsen som anges av datepart.
Ett fel returneras för ett returvärde som ligger utom intervallet för bigint (-9 223 372 036 854 775 808 till 9 223 372 036 854 775 807 DATEDIFF_BIG ). Till skillnad från , som returnerar en int och därför kan spilla över en minut eller högre, DATEDIFF_BIG kan bara spillas om du använder nanosekunder precision där skillnaden mellan enddate och startdate är mer än 292 år, 3 månader, 10 dagar, 23 timmar, 47 minuter och 16,8547758 sekunder.
Om både startdatum och slutdatum endast tilldelas ett tidsvärde och datumdelen inte är en tidsdatumdelDATEDIFF_BIG returnerar 0.
DATEDIFF_BIG använder en tidszonsförskjutningskomponent i startdate eller enddate för att beräkna returvärdet.
För ett smalldatetime-värde som används för startdate eller enddateDATEDIFF_BIG anger alltid sekunder och millisekunder till 0 i returvärdet eftersom smalldatetime bara har noggrannhet till minuten.
Om endast ett tidsvärde tilldelas till en variabel DATEDIFF_BIG för datumdatatyp anger du värdet för den saknade datumdelen till standardvärdet: 1900-01-01. Om endast ett datumvärde tilldelas till en variabel av en tids- eller datumdatatyp anger DATEDIFF_BIG du värdet för den saknade tidsdelen till standardvärdet: 00:00:00. Om antingen startdate eller enddate bara har en tidsdel och den andra endast en datumdel, DATEDIFF_BIG anger du de saknade tids- och datumdelarna till standardvärdena.
Om startdate och enddate har olika datumdatatyper och den ena har mer precision för tidsdelar eller bråksekunder än den andra anger DATEDIFF_BIG de saknade delarna av den andra till 0.
datepart-gränser
Följande instruktioner har samma startdatum och samma enddate-värden . Dessa datum ligger intill varandra och de skiljer sig i tid med hundra nanosekunder (.0000001 sekund). Skillnaden mellan startdate och enddate i varje -instruktion korsar en kalender eller tidsgräns för dess datepart. Varje instruktion returnerar 1. Om startdatum och slutdatum har olika årsvärden men de har samma kalenderveckasvärden DATEDIFF_BIG returneras 0 för datepartweek.
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');
Anmärkningar
Använd DATEDIFF_BIG i satserna SELECT <list>, WHERE, GROUP BYHAVINGoch ORDER BY .
DATEDIFF_BIG omvandlar implicit strängliteraler som en datetime2-typ . Det innebär att DATEDIFF_BIG det inte stöder formatet YDM när datumet skickas som en sträng. Du måste uttryckligen omvandla strängen till en datetime - eller smalldatetime-typ för att använda YDM-formatet.
Att ange SET DATEFIRST har ingen effekt på DATEDIFF_BIG.
DATEDIFF_BIG använder alltid söndag som den första dagen i veckan för att säkerställa att funktionen fungerar på ett deterministiskt sätt.
DATEDIFF_BIG kan flöda över med en nanosekunder om skillnaden mellan enddate och startdate returnerar ett värde som ligger utom räckhåll för bigint.
Examples
Ange kolumner för startdate och enddate
I det här exemplet används olika typer av uttryck som argument för parametrarna startdate och enddate . Den beräknar antalet daggränser som korsas mellan datum i två kolumner i en tabell.
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
Hitta skillnaden mellan startdate och enddate som datumdelssträngar
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
Här är resultatet.
2017 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds
Se närmare relaterade exempel i DATEDIFF (Transact-SQL).