Megosztás a következőn keresztül:


DATEDIFF (Transact-SQL)

Vonatkozik a következőkre:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalitikai 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;