V SQL Server můžete použít T-SQL DATEDIFF() funkce, která vrátí rozdíl mezi dvěma daty/časy. Funguje na jakýkoli výraz, který lze vyřešit na čas , datum , smalldatetime , datum a čas , datetime2 nebo datetimeoffset hodnota.
Tento článek obsahuje příklady DATEDIFF() funkce na serveru SQL.
Syntaxe
Nejprve je zde syntaxe:
DATEDIFF ( datepart , startdate , enddate )
Kde datepart je část data, kterou chcete porovnat. počáteční datum je první datum a koncové datum je datum ukončení.
Funguje to tak, že vrací počet (jako hodnotu celého čísla se znaménkem) zadaného datepart hranice překročeny mezi zadaným počátečním datem a datum ukončení .
Příklad 1
Zde je základní příklad, kde zjistíme počet dní mezi dvěma daty:
SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;
Výsledek:
+----------+ | Result | |----------| | 365 | +----------+
Příklad 2
Zde je další příklad, kdy deklaruji dvě proměnné a přiřadím jim dvě různá data (používám DATEADD() přidat 1 rok k prvnímu datu). Potom použiji DATEDIFF() pro vrácení různých částí data pro toto datum:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 1, @date1);
SELECT
DATEDIFF( year, @date1, @date2 ) AS Years,
DATEDIFF( quarter, @date1, @date2 ) AS Quarters,
DATEDIFF( month, @date1, @date2 ) AS Months,
DATEDIFF( week, @date1, @date2 ) AS Weeks,
DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear,
DATEDIFF( day, @date1, @date2 ) AS Days; Výsledek:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1 | 4 | 12 | 53 | 366 | 366 | +---------+------------+----------+---------+-------------+--------+
Příklad 3
Jak již bylo zmíněno, můžete také vrátit časové části mezi daty. Zde je příklad vrácení počtu hodin, minut a sekund mezi hodnotami data/času:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1);
SELECT
DATEDIFF( hour, @date1, @date2 ) AS Hours,
DATEDIFF( minute, @date1, @date2 ) AS Minutes,
DATEDIFF( second, @date1, @date2 ) AS Seconds; Výsledek:
+---------+-----------+-----------+ | Hours | Minutes | Seconds | |---------+-----------+-----------| | 1 | 60 | 3600 | +---------+-----------+-----------+
Příklad 4
A zde je příklad získání počtu milisekund, mikrosekund a nanosekund mezi dvěma hodnotami data/času:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1);
SELECT
DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds; Výsledek:
+----------------+----------------+---------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+----------------+---------------| | 1 | 1000 | 1000000 | +----------------+----------------+---------------+
Příklad 5 – Chyba!
Pokud se pokusíte udělat něco extrémního, například vrátit počet nanosekund za 100 let, dostanete chybu. Důvodem je DATEDIFF() vrátí int a za 100 let je více nanosekund než int datový typ zvládne.
Takže pokud se o to pokusíte, stane se toto:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000';
DECLARE @date2 datetime2 = DATEADD(year, 100, @date1);
SELECT
DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds,
DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds,
DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds; Výsledek:
The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
Naštěstí, pokud opravdu potřebujete zjistit, kolik nanosekund je za 100 let, můžete použít DATEDIFF_BIG() místo toho funkci. Tato funkce vrací bigint se znaménkem datový typ, který umožňuje vrátit mnohem větší hodnoty než DATEDIFF() může.
Příklad 6 – Získáváte divné výsledky?
Výsledky, které získáte z DATEDIFF() může někdy vypadat úplně špatně, pokud nevíte, jak funkce skutečně funguje.
Například:
DECLARE @startdate datetime2 = '2016-01-01 00:00:00.0000000', @enddate datetime2 = '2016-12-31 23:59:59.9999999'; SELECT DATEDIFF(day, @startdate, @enddate) Days, DATEDIFF(year, @startdate, @enddate) Years;
Výsledek:
+--------+---------+ | Days | Years | |--------+---------| | 365 | 0 | +--------+---------+
Pokud nevíte, jak DATEDIFF() skutečně funguje, tento výsledek by mohl vypadat tak špatně, že by vám bylo odpuštěno za předpokladu, že se jedná o chybu. Ale to není chyba.
Podívejte se na DATEDIFF() vrací nesprávné výsledky v SQL Server? Přečti si tohle. vidět tento příklad a další případy, kdy výsledky mohou vypadat úplně špatně, ale být naprosto správné (a vysvětlení, proč vypadají tak, jak vypadají).
Jeden z příkladů na této stránce zde pravděpodobně stojí za zmínku. DATEDIFF() ve skutečnosti ignoruje váš SET DATEFIRST hodnota. To může vést k neočekávaným výsledkům, zvláště pokud jste v kultuře, která nepoužívá neděli jako první den v týdnu. Podívejte se na toto zástupné řešení pro DATEDIFF() Ignorování SET DATEFIRST na serveru SQL, pokud si myslíte, že by vás to mohlo ovlivnit.