Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí na: SQL Server 2016 (13.x) a novější verze
Azure SQL Database
Azure SQL Managed Instance
SQL 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 .
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).