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.