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


DATEDIFF_BIG (Transact-SQL)

Vonatkozik a következőkre: SQL Server 2016 (13.x) és későbbi verziók Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Ez a függvény a megadott dátumparti határok számát (aláírt nagy egész számként) adja vissza, a megadott kezdődátum és enddátum között keresztezve.

A Transact-SQL dátum- és időadattípusainak és függvényeinek áttekintését a Dátum és idő adattípusok és függvények (Transact-SQL) című témakörben tekintheti meg.

Transact-SQL szintaxis konvenciók

Szemantika

DATEDIFF_BIG ( datepart , startdate , enddate )  

Arguments

datepart
A kezdő és enddátum azon része, amely meghatározza a határátkelések típusát.

Megjegyzés:

DATEDIFF_BIG nem fogadja el a felhasználó által megadott változókból vagy idézett sztringekből származó dátumpart értékeket.

Ez a táblázat felsorolja az összes érvényes datepart argumentumnevet és rövidítést.

dátum Része név datepart rövidítés
év yyy, yyyy
negyed qq, q
hónap Mm, m
napofév DY, y
nap dd, d
hét wk, ww
óra Hh
perc mi, n
második ss, s
Ezredmásodperc Ms
mikroszekundum Mcs
nanoszekundum Ns

Megjegyzés:

Az adott dátumpart-név minden egyes dátumpart-neve és rövidítése ugyanazt az értéket adja vissza.

startdate
Az alábbi értékek egyikére feloldható kifejezés:

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

Dátumként egy oszlopkifejezéstDATEDIFF_BIG, kifejezést, sztringkonstanst vagy felhasználó által definiált változót fogad el. A sztringkonstansértékeket dátum/idő értékre kell feloldani. Használjon négyjegyű éveket a kétértelmű problémák elkerülése érdekében. DATEDIFF_BIG kivonja a kezdődátumot az enddate-ből. A kétértelműség elkerülése érdekében használjon négyjegyű éveket. A kétjegyű évszámmal kapcsolatos információkért tekintse meg a Kétjegyű év leépítési kiszolgáló konfigurációs beállításának konfigurálását .

enddate
Lásd : startdate.

Visszatérési típus

Aláírt bigint

Visszaadott érték

A kezdődátum és az enddátum közötti nagy különbséget adja vissza a datepart által megadott határban kifejezve.

A bigint (-9 223 372 036 854 775 808 és 9 223 372 036 854 775 807 közötti) DATEDIFF_BIG tartományon kívüli visszatérési érték esetén hibát ad vissza. Ellentétben , amely visszaad egy int , és ezért túlcsordulhat egy perc vagy annál magasabb, csak akkor lehet túlcsordulni, DATEDIFF_BIG ha nanoszekundumos pontosságot használ, ahol az enddátum és a startdátum közötti különbség több mint 292 év, 3 hónap, 10 nap, 23 óra, 47 perc és 16,8547758 másodperc.

Ha a kezdő és a végdátum is csak időértékhez van hozzárendelve, és a dátumpart nem idődátum,DATEDIFF_BIG akkor 0 értéket ad vissza.

DATEDIFF_BIG a startdate vagy enddate időzóna-eltolás összetevőjét használja a visszatérési érték kiszámításához.

Az indításhoz vagy az enddátumhoz használt kisdátumérték esetén mindig a másodperceket és az ezredmásodperceket 0 értékre állítja a visszatérési értékben, mert a DATEDIFF_BIG csak a perc pontosságával rendelkezik.

Ha csak egy időérték van hozzárendelve egy dátumadattípus-változóhoz, DATEDIFF_BIG 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_BIG 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_BIG a hiányzó idő- és dátumrészeket az alapértelmezett értékekre állítja.

Ha a startdate és a enddate különböző dátumadattípusokkal rendelkezik, és az egyik több időrészt vagy tört másodperc pontosságot tartalmaz, DATEDIFF_BIG a másik hiányzó részeit 0 értékre állítja.

dátumpart-határok

Az alábbi utasítások azonos kezdőértékekkel és enddátumértékekkel rendelkeznek. Ezek a dátumok szomszédosak, és száz nanoszekundumtal (.0000001 másodperccel) térnek el egymástól. 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 utasítás 1-et ad vissza. Ha a startdate és a enddate eltérő évértékekkel rendelkezik, de ugyanazokkal a naptári heti értékekkel rendelkeznek, DATEDIFF_BIG akkor a dátumparthét esetén 0 értéket ad vissza.

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

Megjegyzések

Használja DATEDIFF_BIG a SELECT <list>, WHERE, HAVINGGROUP BY és ORDER BY záradékokban.

DATEDIFF_BIG implicit módon dátum/idő2 típusként jeleníti meg a sztringkonstansokat. Ez azt jelenti, hogy DATEDIFF_BIG a dátum sztringként való átadásakor nem támogatja az YDM formátumot. Az YDM-formátum használatához explicit módon datetime vagy smalldatetime típusra kell írnia a sztringet.

A beállításnak SET DATEFIRST nincs hatása a parancsra DATEDIFF_BIG. DATEDIFF_BIG 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_BIG nanoszekundummal túlcsordulhat, ha az enddátum és a startdátum közötti különbség olyan értéket ad vissza, amely a bigint tartományán kívül esik.

Példák

Az indítási és enddátumi oszlopok megadása

Ez a példa különböző típusú kifejezéseket használ a startdate és enddate paraméterek argumentumaként. Egy tábla két oszlopában kiszámítja a dátumok közötti határvonalak számát.

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  

Különbség keresése a kezdő és az enddate dátumrész-sztring között

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

Itt van az eredmények összessége.

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

További, közelebbről kapcsolódó példák a DATEDIFF (Transact-SQL)-ban.

Lásd még

CAST és CONVERT (Transact-SQL)
DATEDIFF (Transact-SQL)