Pokud jste někdy potřebovali najít rozdíl mezi dvěma daty na serveru SQL Server, možná jste použili DATEDIFF()
funkce. Tato funkce vrací množství času mezi dvěma daty pomocí datepart vámi zadaný. Můžete jej například použít k vrácení počtu dní mezi datem 1 a datem 2. Můžete jej také použít k vrácení počtu minut, sekund, měsíců, let atd.
DATEDIFF_BIG()
funguje přesně stejným způsobem, ale s jedním jemným rozdílem:svým návratovým datovým typem.
Rozdíl mezi těmito dvěma funkcemi je tedy datový typ jejich návratové hodnoty.
DATEDIFF()
vrátí celé číslo se znaménkem (int )DATEDIFF_BIG()
vrátí velké celé číslo se znaménkem (bigint )
V některých případech nebudete muset vracet bigint datový typ. To představuje velmi velké číslo a zda používáte DATEDIFF()
nebo DATEDIFF_BIG()
nebude žádný rozdíl (kromě požadavků na úložiště – int používá 4 bajty, bigint používá 8 bajtů).
Pokud však narazíte na následující chybu:
Funkce datediff vedla k přetečení. Počet částí data oddělujících dvě instance data/času je příliš velký. Zkuste použít datediff s méně přesnou částí data.
Je to proto, že vrácená hodnota je příliš velká.
V tomto případě budete muset udělat jednu ze tří věcí:
- Použijte kratší časové období. Například místo pokusu vrátit počet milisekund za 26 dní zkuste 25.
- Použijte méně přesné datepart . Například místo toho, abyste se pokoušeli vrátit počet milisekund, zkuste to s pouhými sekundami.
- Použijte
DATEDIFF_BIG()
místo toho.
Někdy první dvě možnosti nejsou vhodné. Pokud potřebujete časové rozpětí 26 dní, 25 to nezkrátí. A pokud potřebujete unixové časové razítko po roce 2038, narazíte na problémy 2038, pokud použijete DATEDIFF()
.
V každém případě DATEDIFF_BIG()
funkce umožňuje mnohem větší rozsah výsledků než DATEDIFF()
.
Příklad
Zde jsou dva příklady, které demonstrují podobnosti a rozdíly mezi DATEDIFF()
a DATEDIFF_BIG()
.
Stejný výsledek
Zde je příklad, kdy obě funkce poskytují stejný výsledek:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF, DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Výsledek:
DATEDIFF DATEDIFF_BIG -------- ------------ 1000 1000
Podle očekávání obě funkce vrátí stejný výsledek. Důvodem je, že návratová hodnota je dostatečně malá, aby pokryla oba bigint a int typy dat. Vše, co jsme udělali, bylo vrátit počet milisekund za 1 sekundu.
Odlišný výsledek
Nyní se podívejme, co se stane, když prodloužíme časový rámec na 1000 let.
Za prvé, zde je to, co se stane, když použijeme DATEDIFF()
:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;
Výsledek:
Error: 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.
Nyní se podívejte, jak DATEDIFF_BIG()
zvládá to:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
Výsledek:
DATEDIFF_BIG -------------- 31556908800000
Vrácení počtu milisekund za 1000 let bylo na int příliš mnoho , ale pro bigint to není problém .