Sdílet prostřednictvím


DATEDIFF_BIG (Transact-SQL)

Platí na: SQL Server 2016 (13.x) a novější verze Azure SQL DatabaseAzure SQL Managed InstanceSQL database in Microsoft Fabric

Tato funkce vrátí počet (jako podepsanou velkou celočíselnou hodnotu) zadaných hranic datových částí překřížených mezi zadaným počátečním a koncovým datem.

Přehled všech datových typů a funkcí jazyka Transact-SQL najdete v tématu Datové typy a funkce data a času jazyka Transact-SQL .

Transact-SQL konvence syntaxe

Syntaxe

DATEDIFF_BIG ( datepart , startdate , enddate )  

Arguments

datepart
Část počátečního a koncového dne , která určuje typ překřížené hranice.

Poznámka:

DATEDIFF_BIG nepřijme hodnoty datové části z uživatelem definovaných proměnných nebo jako uvozované řetězce.

V této tabulce jsou uvedeny všechny platné názvy a zkratky argumentů typu datepart .

název datové části zkratka datepart
rok yyy, yyyyy
čtvrt Qq, q
měsíc Mm, m
denofyear dy, y
den dd, d
týden Wk, WW
hodina hh
minuta MI, N
vteřina SS, S
milisekunda milisekunda
mikrosekunda Mcs
nanosekunda Ns

Poznámka:

Každý konkrétní název a zkratky části data vrátí stejnou hodnotu.

startdate
Výraz, který se dá přeložit na jednu z následujících hodnot:

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

Pro datumDATEDIFF_BIG přijme výraz sloupce, výraz, řetězcový literál nebo uživatelsky definovanou proměnnou. Řetězcová hodnota literálu se musí přeložit na datetime. Vyhnete se problémům s nejednoznačností pomocí čtyřmístných let. DATEDIFF_BIG odečte počáteční datum od koncového dne. Abyste se vyhnuli nejednoznačnosti, použijte čtyři číslice let. Informace o dvouciferných letech najdete v tématu Konfigurace dvouciferného roku konfigurace serveru .

enddate
Viz startdate.

Návratový typ

Podepsaný bigint

Návratová hodnota

Vrátí velký rozdíl mezi počátečním a koncovým datem vyjádřeným v hranici nastavené podle hodnoty datepart.

Pro návratovou hodnotu mimo rozsah pro bigint (-9 223 372 036 854 775 808 až 9 223 372 036 854 775 807) DATEDIFF_BIG vrátí chybu. Na rozdíl od toho, který vrací int, a proto může přetékat minutu nebo vyšší, DATEDIFF_BIG může přetékat pouze v případě, že používá nanosekundovou přesnost, kde rozdíl mezi koncovým datem a počátečním datem je delší než 292 let, 3 měsíce, 10 dní, 23 hodin, 47 minut a 16,8547758 sekund.

Pokud jsou počáteční a koncové datum přiřazeny pouze časové hodnoty a část datepart není časová část, DATEDIFF_BIG vrátí hodnotu 0.

DATEDIFF_BIG používá komponentu posunu časového pásma počátečního nebo koncového dne k výpočtu návratové hodnoty.

Pro hodnotu smalldatetime použitou pro datum zahájení nebo enddate, vždy nastaví sekundy a milisekundy na 0 v návratové hodnotě, DATEDIFF_BIG protože smalldatetime má přesnost pouze na minutu.

Pokud je k proměnné datového typu kalendářního data přiřazena pouze časová hodnota, DATEDIFF_BIG nastaví hodnotu chybějící části data na výchozí hodnotu: 1900-01-01. Pokud je k proměnné datového typu čas nebo datum přiřazena pouze hodnota data, DATEDIFF_BIG nastaví hodnotu chybějící časové části na výchozí hodnotu: 00:00:00. Pokud mají počáteční nebo koncové datum pouze časovou část a druhá pouze část data, DATEDIFF_BIG nastaví chybějící části času a data na výchozí hodnoty.

Pokud počáteční a koncové datum mají různé datové typy kalendářních dat a jedna má více časových částí nebo desetinných sekund přesnost než druhá, DATEDIFF_BIG nastaví chybějící části druhého na 0.

Hranice datových částí

Následující příkazy mají stejné počáteční datum a stejné hodnoty enddate . Tato data jsou sousední a liší se v čase o sto nanosekund (.0000001 sekundu). Rozdíl mezi počátečním a koncovým datem v každém příkazu překračuje jednu kalendářní nebo časovou hranici jeho části data. Každý příkaz vrátí hodnotu 1. Pokud počáteční a koncové datum mají různé hodnoty roku, ale mají stejné hodnoty kalendářního týdne, DATEDIFF_BIG vrátí hodnotu 0 pro týden kalendářníhotýdne.

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

Poznámky

Použijte DATEDIFF_BIG v SELECT <list>klauzulích , WHERE, HAVINGGROUP BYa ORDER BY klauzule.

DATEDIFF_BIG implicitně přetypuje řetězcové literály jako typ datetime2 . To znamená, že DATEDIFF_BIG nepodporuje formát YDM, pokud se datum předá jako řetězec. Pokud chcete použít formát YDM, musíte řetězec explicitně přetypovat na typ datetime nebo smalldatetime .

Určení SET DATEFIRST nemá žádný vliv na DATEDIFF_BIG. DATEDIFF_BIG vždy používá neděli jako první den v týdnu, aby se zajistilo, že funkce funguje deterministickým způsobem.

DATEDIFF_BIG může přetékat nanosekundou , pokud rozdíl mezi koncovým dnem a počátečním dnem vrátí hodnotu, která je mimo rozsah pro bigint.

Examples

Určení sloupců pro počáteční a koncové datum

Tento příklad používá různé typy výrazů jako argumenty pro parametry startdate a enddate . Vypočítá počet hranic dnů překřížených mezi kalendářními daty ve dvou sloupcích tabulky.

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  

Zjištění rozdílu mezi počátečním a koncovým datem jako řetězci částí kalendářních dat

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

Tady je soubor výsledků.

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

Podívejte se blíže na související příklady v DATEDIFF (Transact-SQL).

Viz také

CAST a CONVERT (Transact-SQL)
DATEDIFF (Transact-SQL)