Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op: SQL Server 2016 (13.x) en latere versies
van Azure SQL Database
Azure 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).