Delen via


DATEDIFF_BIG (Transact-SQL)

Van toepassing op: SQL Server 2016 (13.x) en latere versies van Azure SQL DatabaseAzure SQL Managed Instance

Deze functie retourneert het aantal (als een ondertekende grote geheel getalwaarde) van de opgegeven datumpartgrenzen die zijn overschreden tussen de opgegeven begindatum en einddatum.

Zie Datum- en tijdgegevenstypen en -functies (Transact-SQL) voor een overzicht van alle transact-SQL-datum- en tijdgegevenstypen en -functies.

Transact-SQL syntaxis-conventies

Syntaxis

DATEDIFF_BIG ( datepart , startdate , enddate )  

Arguments

datepart
Het deel van startdate en enddate dat aangeeft welk type grens is overschreden.

Opmerking

DATEDIFF_BIG accepteert geen datumonderdelenwaarden van door de gebruiker gedefinieerde variabelen of als tekenreeksen tussen aanroepen.

In deze tabel worden alle geldige namen en afkortingen van datumonderdelen weergegeven.

datumpartnaam datumpart afkorting
jaar yyy, jjjj
wijk qq, q
maand mm, m
dayofyear dy, y
dag dd, d
week wk, ww
uur hh
minuut mi, n
tweede ss, s
milliseconde mevrouw
microseconde Mcs
nanoseconde Ns

Opmerking

Elke specifieke datumpartnaam en afkortingen voor die datepart-naam retourneren dezelfde waarde.

startdate
Een expressie die kan worden omgezet in een van de volgende waarden:

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

Voor datumDATEDIFF_BIG accepteert u een kolomexpressie, expressie, letterlijke tekenreeks of door de gebruiker gedefinieerde variabele. Een letterlijke tekenreekswaarde moet worden omgezet in een datum/tijd. Gebruik viercijferige jaren om dubbelzinnigheidsproblemen te voorkomen. DATEDIFF_BIG Hiermee wordt de begindatumafgetrokken van enddate. Gebruik viercijferige jaren om dubbelzinnigheid te voorkomen. Zie De optie serverconfiguratie van twee cijfers configureren voor meer informatie over tweecijferige jaren.

einddatum
Zie startdate.

Retourtype

Ondertekende bigint

Retourwaarde

Retourneert het bigint-verschil tussen de begindatum en de einddatum, uitgedrukt in de grens die is ingesteld op datepart.

Voor een retourwaarde buiten het bereik voor bigint (-9.223.372.036.854.775.808 tot 9.223.372.036.854.775.807), DATEDIFF_BIG wordt een fout geretourneerd. In tegenstelling tot , wat een int retourneert en daarom een minuut of hoger kan overlopen, DATEDIFF_BIG kan alleen overlopen als het gebruik van nanosecondenprecisie waarbij het verschil tussen enddate en begindatum langer is dan 292 jaar, 3 maanden, 10 dagen, 23 uur, 47 minuten en 16,8547758 seconden.

Als begindatum en einddatum beide alleen een tijdwaarde hebben en het datumdeel geen datumgedeelte is, DATEDIFF_BIG wordt 0 geretourneerd.

DATEDIFF_BIG gebruikt een tijdzoneverschilonderdeel van begindatum of einddatum om de retourwaarde te berekenen.

Voor een waarde voor smalldatetime die wordt gebruikt voor begindatum of einddatum, DATEDIFF_BIG worden altijd seconden en milliseconden ingesteld op 0 in de retourwaarde, omdat smalldatetime alleen nauwkeurigheid tot de minuut heeft.

Als alleen een tijdwaarde is toegewezen aan een datumgegevenstypevariabele, DATEDIFF_BIG stelt u de waarde van het ontbrekende datumonderdeel in op de standaardwaarde: 1900-01-01. Als alleen een datumwaarde is toegewezen aan een variabele van een tijd- of datumgegevenstype, DATEDIFF_BIG wordt de waarde van het ontbrekende tijdgedeelte ingesteld op de standaardwaarde: 00:00:00 Als begindatum of einddatum slechts een tijdgedeelte en het andere slechts een datumonderdeel hebben, DATEDIFF_BIG stelt u de ontbrekende tijd- en datumonderdelen in op de standaardwaarden.

Als begin- en einddatum verschillende datumgegevenstypen hebben en één datum meer tijdonderdelen of fractionele seconden precisie heeft dan de andere, DATEDIFF_BIG stelt u de ontbrekende delen van de andere in op 0.

datumdeelgrenzen

De volgende instructies hebben dezelfde begindatum en dezelfde einddatumwaarden . Deze datums zijn aangrenzend en verschillen in tijd met honderd nanoseconden (.0000001 seconde). Het verschil tussen de begindatum en einddatum in elke instructie overschrijdt één kalender of tijdgrens van het datumgedeelte. Elke instructie retourneert 1. Als begindatum en einddatum verschillende jaarwaarden hebben, maar dezelfde kalenderweekwaarden hebben, DATEDIFF_BIG wordt 0 geretourneerd voor datumdeelweek.

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');

Opmerkingen

Gebruiken DATEDIFF_BIG in de SELECT <list>, WHERE- en GROUP BYHAVINGORDER BY componenten.

DATEDIFF_BIG hiermee worden letterlijke tekenreeksen impliciet omgezet als een datum/tijd2-type . Dit betekent dat DATEDIFF_BIG de notatie YDM niet wordt ondersteund wanneer de datum wordt doorgegeven als een tekenreeks. U moet de tekenreeks expliciet casten naar een datum/tijd - of smalldatetime-type om de YDM-indeling te gebruiken.

SET DATEFIRST Opgeven heeft geen effect op DATEDIFF_BIG. DATEDIFF_BIG gebruikt altijd zondag als de eerste dag van de week om ervoor te zorgen dat de functie op een deterministische manier werkt.

DATEDIFF_BIG kan overlopen met een nanoseconde als het verschil tussen einddatum en begindatum een waarde retourneert die buiten het bereik valt voor bigint.

Voorbeelden

Kolommen opgeven voor begindatum en einddatum

In dit voorbeeld worden verschillende typen expressies gebruikt als argumenten voor de parameters begindatum en einddatum . Hiermee wordt het aantal daggrenzen berekend dat wordt overschreden tussen datums in twee kolommen van een tabel.

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  

Verschil zoeken tussen begindatum en einddatum als tekenreeksen voor datumonderdelen

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

Hier is het resultatenoverzicht.

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

Zie meer verwante voorbeelden in DATEDIFF (Transact-SQL).

Zie ook

CAST en CONVERTEREN (Transact-SQL)
DATEDIFF (Transact-SQL)