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

Jak opravit chybu „funkce datediff vedla k přetečení“ na serveru SQL Server

Tento článek poskytuje řešení problému, se kterým se můžete občas setkat při používání DATEDIFF() funkce na serveru SQL.

Pokud 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 návratová hodnota je příliš velká. DATEDIFF() funkce vrátí výsledek jako int datový typ. Důvodem, proč jste dostali tuto zprávu, je to, že návratová hodnota je příliš velká pro int datový typ. Naštěstí existuje snadný způsob, jak to opravit.

Nejrychlejším a nejjednodušším způsobem, jak tento problém vyřešit, je přepnout na DATEDIFF_BIG() funkce. Tato funkce funguje přesně jako DATEDIFF() , kromě toho, že jeho návratový datový typ je bigint se znaménkem . Jinými slovy, zvládne opravdu velká čísla.

Příklad

Podívejme se, zda DATEDIFF() nám může říct, kolik milisekund je za tisíc let:

SELECT DATEDIFF( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years';

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. 

Možná ne. Zdá se, že je příliš mnoho milisekund na to, aby se vešlo do int .

Čas na velké zbraně. DATEDIFF_BIG() , dělejte své věci…

SELECT DATEDIFF_BIG( 
    millisecond, 
    SYSDATETIME(), 
    DATEADD(year, 1000, SYSDATETIME()) ) AS 'Milliseconds in 1000 years';  

Výsledek:

Milliseconds in 1000 years
--------------------------
31556908800000            

To je lepší.

Pokud se stále zobrazuje výše uvedená chybová zpráva, musíte se snažit vrátit skutečně velké číslo. V takovém případě budete muset provést alespoň jednu z následujících akcí:

  • Použijte kratší časové období.
  • 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.

Pamatujte také, že před použitím DATEDIFF_BIG() musíte mít spuštěný alespoň SQL Server 2016 funkce.


  1. SQL Query pomalý v aplikaci .NET, ale okamžitý v SQL Server Management Studio

  2. Vícenásobné vložení SQL Oracle

  3. Nejlepší skupiny na Facebooku pro Analytics, Big Data, Data Mining, Hadoop, NoSQL, Data Science

  4. Hibernate, Postgresql:Sloupec x je typu oid, ale výraz je typu byte