Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Vonatkozik a következőkre:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analitikai Platform System (PDW)
SQL adatbázis a Microsoft Fabric-ben
Ez a függvény adja vissza a megadott dátumrész határainak számát (mint egy aláírt egész értéket) a megadott kezdő és végdátum közötti határok számát.
Lásd DATEDIFF_BIG egy olyan függvényt, amely nagyobb különbségeket kezel a kezdő és végdátum értékei között. Az összes Transact-SQL dátum - és időadattípus és -függvény áttekintéséhez tekintse meg a Dátum és idő adattípusokat és függvényeket .
Transact-SQL szintaxis konvenciók
Szemantika
DATEDIFF ( datepart , startdate , enddate )
Arguments
datepart
Megadja azokat az egységeket, amelyekben DATEDIFF a kezdési és végdátum közötti különbséget jelenti. A leggyakrabban használt dátumrészes egységek közé tartozik month vagy second.
A datepart érték nem lehet megadni változóban, sem idézetes stringként, mint 'month'.
Az alábbi táblázat felsorolja az összes érvényes datepart értéket.
DATEDIFF elfogadja a dátumrész teljes nevét, vagy a teljes név bármely felsorolt rövidítését.
| dátum Része név | datepart rövidítés |
|---|---|
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 |
Minden adott datepart név és rövidítések ugyanazt az értéket adják vissza.
startdate
Az alábbi értékek egyikére feloldható kifejezés:
- date
- datetime
- datetimeoffset
- datetime2
- smalldatetime
- time
Használj négyjegyű éveket a kétértelműség elkerülésére. A két számjegyű év értékekről információért lásd: szerver konfiguráció: kétjegyű év határérték .
enddate
Lásd : startdate.
Visszatérési típusok
int
Visszaadott érték
Az int különbség a kezdő és végdátum között, amelyet a datepart által meghatározott határon fejezik ki.
Például a SELECT DATEDIFF(day, '2036-03-01', '2036-02-28'); visszajelzések -2, utalva arra, hogy 2036-nak kell lennie a szökőévnek. Ez az eset azt jelenti, hogy ha a kezdési dátumtól2036-03-01 kezdünk, majd a napokat számoljuk-2, elérjük a végdátumot2036-02-28.
Az int tartományon kívüli hozamérték esetén (-2,147,483,648 +2,147,483,647) hibát DATEDIFF ad vissza. A millisecondkövetkező időpont és a végdátum közötti maximális különbség 24 nap, 20 óra, 31 perc és 23,647 másodperc. A secondmaximális különbség 68 év, 19 nap, 3 óra, 14 perc és 7 másodperc.
Ha a kezdődátum és a végdátum csak időértéket kap, és a dátumrész nem idődátumrész, DATEDIFF akkor visszaadja 0a .
DATEDIFF a kezdő vagy végdátum időzóna eltolási komponense alapján számolja ki a visszatérési értéket.
Mivel a smalldatetime csak percre vonatkozik, a visszaküldési értékben mindig a másodpercek és milliszekundumok vannak beállítva0, ha a kezdődátum vagy a végdátum kisdátum értéke van.
Ha csak egy időérték van hozzárendelve egy dátumadattípus-változóhoz, DATEDIFF a hiányzó dátumrész értékét az alapértelmezett értékre állítja: 1900-01-01. Ha csak dátumérték van hozzárendelve egy idő- vagy dátum típusú változóhoz, DATEDIFF a hiányzó időrész értékét az alapértelmezett értékre állítja: 00:00:00. Ha a startdate vagy a enddate csak időrészt tartalmaz, a másik csak dátumrészt, DATEDIFF a hiányzó idő- és dátumrészeket az alapértelmezett értékekre állítja.
Ha a kezdő és a végdátum eltérő dátum adattípusú, és az egyiknek több időrészlet vagy töredékmásodperc pontossága van, DATEDIFF akkor a másik hiányzó részeit úgy állítjuk be.0
Dátum határai
Az alábbi utasítások azonos kezdőértékekkel és enddátumértékekkel rendelkeznek. Ezek az időpontok egymás mellett helyezkednek el, és időbeli különbségük száz nanoszekundumust (0,0000001 másodpercet) különbözik. Az egyes utasítások kezdődátuma és enddátuma közötti különbség átlépi a dátumrész egy naptár- vagy időhatárát. Minden állítás visszaadja 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');
Ha a kezdő és a végdátum eltérő évértékű, de ugyanazok a naptári hét értéke, DATEDIFF akkor a 0 visszatérítéseweek.
Megjegyzések
Használat DATEDIFF a SELECT <list>, WHERE, HAVINGGROUP BY, , és ORDER BY a mondatokban.
DATEDIFF implicit módon dátum/idő2 típusként jeleníti meg a sztringkonstansokat. Más szóval, DATEDIFF nem támogatja a formátumot YDM , amikor a dátumot stringként adják át. A formátum használatához kifejezetten a zúrt datetime vagy smalldatetime típusra YDM kell önteni.
A beállításnak SET DATEFIRST nincs hatása a parancsra DATEDIFF.
DATEDIFF mindig a vasárnapot használja a hét első napjaként annak biztosítására, hogy a függvény determinisztikus módon működjön.
DATEDIFF túlcsordulás pontossággal vagy minute annál magasabb, ha a végdátum és a kezdési dátum közötti különbség olyan értéket ad vissza, ami az int tartományán kívül esik.
Példák
A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.
Ezek a példák különböző típusú kifejezéseket használnak argumentumként a kezdő és végdátum paraméterekhez.
A. Oszlopok megadása a kezdő és végi dátumhoz
Ez a példa két oszlopban számolja ki a dátumok közötti naphatárok számát egy táblázatban.
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;
Itt van az eredmények összessége.
Duration
--------
1
B. Felhasználó által definiált változókat határozz meg a kezdő és végi dátumhoz
Ebben a példában a felhasználó által definiált változók érvei a kezdő és végi dátum számára.
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. Skalárrendszer függvények megadása indulási és végdátumhoz
Ez a példa skaláris rendszerfüggvényeket használ indító - és végdátum argumentumaként.
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());
D. Határozd meg a skaláris allekérdezéseket és skaláris függvényeket a kezdő és végdátumhoz
Ez a példa skaláris allekérdezéseket és skaláris függvényeket használ argumentumként a kezdő és végdátum számára.
USE AdventureWorks2022;
GO
SELECT DATEDIFF(day, (SELECT MIN(OrderDate)
FROM Sales.SalesOrderHeader), (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader));
E. Határozd meg a kezdő és végi dátumhoz az állandókat
Ez a példa karakterállandókat használ kezdő ésvégdátum argumentumaként.
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', '2007-05-08 09:53:01.0376635');
F. Határozd meg numerikus kifejezéseket és skaláris rendszerfüggvényeket a végdátumhoz
Ez a példa numerikus kifejezést, (GETDATE() + 1), valamint skaláris rendszerfüggvényeket GETDATE és SYSDATETIME, érveként a végdátumhoz.
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. Rangsorolási függvények megadása a startdate-hez
Ez a példa rangsorolási függvényt használ a startdate érveként.
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. Határozz meg egy aggregált ablakfüggvényt a startdate-hez
Ez a példa aggregált ablakfüggvényt használ az indulási dátum argumentumaként.
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. Keresd meg a különbséget a kezdő és végdátum között dátum részsorozatként
-- 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;
Itt van az eredmények összessége.
118 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds
Példák: Azure Synapse Analytics and Analytics Platform System (PDW)
Ezek a példák különböző típusú kifejezéseket használnak argumentumként a kezdő és végdátum paraméterekhez.
J. Oszlopok megadása a kezdő és végi dátumhoz
Ez a példa két oszlopban számolja ki a dátumok közötti naphatárok számát egy táblázatban.
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. Határozd meg a skaláris allekérdezéseket és skaláris függvényeket a kezdő és végdátumhoz
Ez a példa skaláris allekérdezéseket és skaláris függvényeket használ argumentumként a kezdő és végdátum számára.
-- Uses AdventureWorks
SELECT TOP (1) DATEDIFF(day, (SELECT MIN(HireDate)
FROM dbo.DimEmployee), (SELECT MAX(HireDate)
FROM dbo.DimEmployee))
FROM dbo.DimEmployee;
L. Határozd meg a kezdő és végi dátumhoz az állandókat
Ez a példa karakterállandókat használ kezdő ésvégdátum argumentumaként.
-- Uses AdventureWorks
SELECT TOP (1) DATEDIFF(day, '2007-05-07 09:53:01.0376635', '2007-05-08 09:53:01.0376635')
FROM DimCustomer;
M. Rangsorolási függvények megadása a startdate-hez
Ez a példa rangsorolási függvényt használ a startdate érveként.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY DepartmentName), SYSDATETIME()) AS RowNumber
FROM dbo.DimEmployee;
N. Határozz meg egy aggregált ablakfüggvényt a startdate-hez
Ez a példa aggregált ablakfüggvényt használ az indulási dátum argumentumaként.
-- Uses AdventureWorks
SELECT FirstName,
LastName,
DepartmentName,
DATEDIFF(year, MAX(HireDate) OVER (PARTITION BY DepartmentName), SYSDATETIME()) AS SomeValue
FROM dbo.DimEmployee;