sql >> Databáze >  >> RDS >> Sqlserver

DATEDIFF() vs DATEDIFF_BIG() v SQL Server:Jaký je rozdíl?

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 .


  1. OdbcConnection vrací čínské znaky jako ?

  2. Hromadné vkládání do databáze Oracle:Co je lepší:FOR Kurzorová smyčka nebo jednoduchý výběr?

  3. MySQL mezi klauzulí není zahrnuto?

  4. Anonymní typ TABLE nebo VARRAY v Oracle