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
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform Systeem (PDW)
SQL-database in Microsoft Fabric
Deze functie geeft het aantal (als een getekende gehele getal) van de gespecificeerde datumdeelgrenzen terug die tussen de opgegeven begindatum en einddatum zijn gekruist.
Zie DATEDIFF_BIG voor een functie die grotere verschillen tussen de start- en einddatumwaarden verwerkt. Zie datum- en tijdgegevenstypen en -functies voor een overzicht van alle Transact-SQL datum- en tijdgegevenstypen en -functies.
Transact-SQL syntaxis-conventies
Syntaxis
DATEDIFF ( datepart , startdate , enddate )
Arguments
datepart
Specificeert de eenheden waarin DATEDIFF het verschil tussen de begindatum en einddatum wordt gerapporteerd. Veelgebruikte datepart-eenheden zijn onder andere month of second.
De datepart-waarde kan niet worden opgegeven in een variabele, noch als een quote-string zoals 'month'.
De volgende tabel geeft alle geldige datumdeelwaarden weer.
DATEDIFF accepteert ofwel de volledige naam van de datumdeel, of elke vermelde afkorting van de volledige naam.
| datumpartnaam | datumpart afkorting |
|---|---|
year |
yy, yyyy |
quarter |
qq, q |
month |
mm, m |
dayofyear |
dy, y |
day |
dd, d |
week |
wk, ww |
weekday |
dw, w |
hour |
hh |
minute |
mi, n |
second |
ss, s |
millisecond |
ms |
microsecond |
mcs |
nanosecond |
ns |
Elke specifieke datumdeelnaam en afkortingen voor die datumdeelnaam geven dezelfde waarde op.
startdate
Een expressie die kan worden omgezet in een van de volgende waarden:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Gebruik viercijferige jaren om onduidelijkheid te voorkomen. Zie Serverconfiguratie: tweecijferige jaargrens voor informatie over tweecijferige jaarwaarden.
einddatum
Zie startdate.
Retourtypen
int
Retourwaarde
Het int-verschil tussen de begindatum en einddatum, uitgedrukt in de grens die door datumdeel wordt gezet.
Bijvoorbeeld, rendementen SELECT DATEDIFF(day, '2036-03-01', '2036-02-28');-2, wat suggereert dat 2036 een schrikkeljaar moet zijn. Dit betekent dat als we beginnen op de startdatum2036-03-01 en vervolgens de dagen tellen -2 , we de einddatum van 2036-02-28bereiken.
Voor een retourwaarde buiten het bereik van int (-2.147.483.648 tot +2.147.483.647), DATEDIFF geeft een foutmelding terug. Voor millisecondis het maximale verschil tussen startdatum en einddatum 24 dagen, 20 uur, 31 minuten en 23,647 seconden. Voor secondis het maximale verschil 68 jaar, 19 dagen, 3 uur, 14 minuten en 7 seconden.
Als startdatum en einddatum allebei slechts een tijdswaarde krijgen, en het datumdeel geen tijdsdatumdeel is, DATEDIFF geeft 0het .
DATEDIFF gebruikt de tijdzone-offsetcomponent van start- of einddatum om de retourwaarde te berekenen.
Omdat smalldatetime alleen nauwkeurig is tot op de minuut, worden seconden en milliseconden altijd ingesteld op 0 de retourwaarde wanneer start- of enddate een smalldatetime-waarde heeft.
Als alleen een tijdwaarde is toegewezen aan een datumgegevenstypevariabele, DATEDIFF 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 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 stelt u de ontbrekende tijd- en datumonderdelen in op de standaardwaarden.
Als startdatum en einddatum verschillende datatypes hebben, en de ene meer tijdsdelen of fractieseconden precisie heeft dan de andere, DATEDIFF wordt de ontbrekende delen van de andere gezet op 0.
Datumdeelgrenzen
De volgende instructies hebben dezelfde begindatum en dezelfde einddatumwaarden . Die data liggen naast elkaar en verschillen in tijd met honderd nanoseconden (0,0000001 seconde). Het verschil tussen de begindatum en einddatum in elke instructie overschrijdt één kalender of tijdgrens van het datumgedeelte. Elke uitspraak geeft .1
SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(weekday, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(microsecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
Als startdatum en einddatum verschillende jaarwaarden hebben, maar dezelfde kalenderweekwaarden, geldt DATEDIFF dat voor 0datumdeelweek.
Opmerkingen
Gebruik DATEDIFF in de SELECT <list>, WHERE, HAVING, , GROUP BYen ORDER BY clausules.
DATEDIFF hiermee worden letterlijke tekenreeksen impliciet omgezet als een datum/tijd2-type . Met andere woorden, DATEDIFF ondersteunt het formaat YDM niet wanneer de datum als string wordt doorgegeven. Je moet de string expliciet naar een datetime- of smalldatetime-type casten om het YDM formaat te gebruiken.
SET DATEFIRST Opgeven heeft geen effect op DATEDIFF.
DATEDIFF gebruikt altijd zondag als de eerste dag van de week om ervoor te zorgen dat de functie op een deterministische manier werkt.
DATEDIFF kan overlopen met een precisie van of minute hoger, als het verschil tussen eind- en begindatum een waarde oplevert die buiten het bereik van int.
Voorbeelden
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
Deze voorbeelden gebruiken verschillende soorten expressies als argumenten voor de start- en einddatumparameters .
Eén. Specificeer kolommen voor start- en einddatum
Dit voorbeeld berekent het aantal daggrenzen dat tussen data wordt gekruist in twee kolommen in 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(day, startDate, endDate) AS [Duration]
FROM dbo.Duration;
Hier is het resultatenoverzicht.
Duration
--------
1
B. Specificeer door de gebruiker gedefinieerde variabelen voor start- en einddatum
In dit voorbeeld dienen door de gebruiker gedefinieerde variabelen als argumenten voor start- en einddatum.
DECLARE @startdate AS DATETIME2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate AS DATETIME2 = '2007-05-04 12:10:09.3312722';
SELECT DATEDIFF(day, @startdate, @enddate);
C. Specificeer scalaire systeemfuncties voor startdatum en einddatum
Dit voorbeeld gebruikt functies van het scalaire systeem als argumenten voor start- en einddatum.
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());
D. Specificeer scalaire subqueries en scalaire functies voor start- en enddate
Dit voorbeeld gebruikt scalaire subqueries en scalaire functies als argumenten voor start- en einddatum.
USE AdventureWorks2022;
GO
SELECT DATEDIFF(day, (SELECT MIN(OrderDate)
FROM Sales.SalesOrderHeader), (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader));
E. Specificeer constanten voor start- en einddatum
Dit voorbeeld gebruikt karakterconstanten als argumenten voor start- en einddatum.
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', '2007-05-08 09:53:01.0376635');
F. Specificeer numerieke expressies en functies van het scalair systeem voor einddatum
Dit voorbeeld gebruikt een numerieke expressie, (GETDATE() + 1), en scalaire systeemfuncties GETDATE en SYSDATETIME, als argumenten voor einddatum.
USE AdventureWorks2022;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE() + 1) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2022;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day, 1, SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
G. Specificeer rangschikkingsfuncties voor startdatum
Dit voorbeeld gebruikt een rangschikkingsfunctie als argument voor de startdatum.
USE AdventureWorks2022;
GO
SELECT p.FirstName,
p.LastName,
DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY a.PostalCode), SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
H. Specificeer een aggregaatvensterfunctie voor startdate
Dit voorbeeld gebruikt een aggregaatvensterfunctie als argument voor de startdatum.
USE AdventureWorks2022;
GO
SELECT soh.SalesOrderID,
sod.ProductID,
sod.OrderQty,
soh.OrderDate,
DATEDIFF(day, MIN(soh.OrderDate) OVER (PARTITION BY soh.SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail AS sod
INNER JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
WHERE soh.SalesOrderID IN (43659, 58918);
GO
I. Vind het verschil tussen start- en einddatum als datum snaren deelt
-- DOES NOT ACCOUNT FOR LEAP YEARS
DECLARE @date1 AS DATETIME, @date2 AS DATETIME, @result AS VARCHAR (100);
DECLARE @years AS INT, @months AS INT, @days AS INT, @hours AS INT, @minutes AS INT, @seconds AS INT, @milliseconds AS INT;
SET @date1 = '1900-01-01 00:00:00.000';
SET @date2 = '2018-12-12 07:08:01.123';
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.
118 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds
Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)
Deze voorbeelden gebruiken verschillende soorten expressies als argumenten voor de start- en einddatumparameters .
J. Specificeer kolommen voor start- en einddatum
Dit voorbeeld berekent het aantal daggrenzen dat tussen data wordt gekruist in twee kolommen in 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 TOP (1) DATEDIFF(day, startDate, endDate) AS [Duration]
FROM dbo.Duration;
Duration
--------
1
K. Specificeer scalaire subqueries en scalaire functies voor start- en enddate
Dit voorbeeld gebruikt scalaire subqueries en scalaire functies als argumenten voor start- en einddatum.
-- Uses AdventureWorks
SELECT TOP (1) DATEDIFF(day, (SELECT MIN(HireDate)
FROM dbo.DimEmployee), (SELECT MAX(HireDate)
FROM dbo.DimEmployee))
FROM dbo.DimEmployee;
L. Specificeer constanten voor start- en einddatum
Dit voorbeeld gebruikt karakterconstanten als argumenten voor start- en einddatum.
-- Uses AdventureWorks
SELECT TOP (1) DATEDIFF(day, '2007-05-07 09:53:01.0376635', '2007-05-08 09:53:01.0376635')
FROM DimCustomer;
M. Specificeer rangschikkingsfuncties voor startdatum
Dit voorbeeld gebruikt een rangschikkingsfunctie als argument voor de startdatum.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY DepartmentName), SYSDATETIME()) AS RowNumber
FROM dbo.DimEmployee;
N. Specificeer een aggregaatvensterfunctie voor startdate
Dit voorbeeld gebruikt een aggregaatvensterfunctie als argument voor de startdatum.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
DepartmentName,
DATEDIFF(year, MAX(HireDate) OVER (PARTITION BY DepartmentName), SYSDATETIME()) AS SomeValue
FROM dbo.DimEmployee;