sql >> Database >  >> RDS >> Sqlserver

DATEDIFF() vs DATEDIFF_BIG() in SQL Server:wat is het verschil?

Als je ooit het verschil tussen twee datums in SQL Server hebt moeten vinden, heb je misschien de DATEDIFF() gebruikt functie. Deze functie retourneert de hoeveelheid tijd tussen twee datums met behulp van een datepart door u opgegeven. U kunt het bijvoorbeeld gebruiken om het aantal dagen tussen datum 1 en datum 2 terug te geven. U kunt het ook gebruiken om het aantal minuten, seconden, maanden, jaren, enz. terug te geven.

De DATEDIFF_BIG() functie werkt op precies dezelfde manier, maar met één subtiel verschil:het retourgegevenstype.

Het verschil tussen deze twee functies is dus het gegevenstype van hun retourwaarde.

  • DATEDIFF() geeft een geheel getal met teken terug (int )
  • DATEDIFF_BIG() geeft een ondertekend groot geheel getal terug (bigin )

In sommige gevallen heb je niet veel nodig om een ​​bigint . terug te geven data type. Dit vertegenwoordigt een heel groot getal, en of je DATEDIFF() gebruikt? of DATEDIFF_BIG() maakt geen verschil (behalve voor opslagvereisten – int gebruikt 4 bytes, bigint gebruikt 8 bytes).

Als u echter de volgende fout tegenkomt:

De datediff-functie zorgde voor een overflow. Het aantal dateparts dat twee datum/tijd-instanties van elkaar scheidt, is te groot. Probeer datediff te gebruiken met een minder nauwkeurig datepart.

Dit komt omdat de retourwaarde te groot is.

In dit geval moet u een van de volgende drie dingen doen:

  • Gebruik een kortere periode. Probeer bijvoorbeeld 25 in plaats van te proberen het aantal milliseconden in 26 dagen terug te geven.
  • Gebruik een minder nauwkeurige datepart . Bijvoorbeeld, in plaats van te proberen het aantal milliseconden terug te geven, probeer het met slechts enkele seconden.
  • Gebruik de DATEDIFF_BIG() functie in plaats daarvan.

Soms zijn de eerste twee opties niet geschikt. Als je een tijdspanne van 26 dagen nodig hebt, zal 25 het niet redden. En als je een Unix-tijdstempel na 2038 nodig hebt, zul je 2038-problemen tegenkomen als je DATEDIFF() gebruikt .

In ieder geval de DATEDIFF_BIG() functie zorgt voor een veel groter bereik aan resultaten dan DATEDIFF() .

Voorbeeld

Hier zijn twee voorbeelden om zowel de overeenkomsten als de verschillen aan te tonen tussen DATEDIFF() en DATEDIFF_BIG() .

Hetzelfde resultaat

Hier is een voorbeeld waarbij beide functies hetzelfde resultaat opleveren:

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;

Resultaat:

DATEDIFF  DATEDIFF_BIG
--------  ------------
1000      1000        

Zoals verwacht, retourneren beide functies hetzelfde resultaat. Dit komt omdat de retourwaarde klein genoeg is om te voorzien in zowel grote en int gegevens typen. Het enige wat we deden was het aantal milliseconden in 1 seconde teruggeven.

Ander resultaat

Dit is wat er gebeurt als we het tijdsbestek verlengen tot 1000 jaar.

Ten eerste, dit is wat er gebeurt als we DATEDIFF() gebruiken :

DECLARE @date1 datetime2 = SYSDATETIME();
DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME());
SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;

Resultaat:

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.

Nu, hier is hoe DATEDIFF_BIG() regelt het:

DECLARE @date1 datetime2 = SYSDATETIME();
DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME());
SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;

Resultaat:

DATEDIFF_BIG  
--------------
31556908800000

Het aantal milliseconden in 1000 jaar teruggeven was te veel voor een int , maar het is geen probleem voor een grote .


  1. Referentie:wat is een perfect codevoorbeeld met de MySQL-extensie?

  2. Omgaan met trage zoekopdrachten met PostgreSQL

  3. Hoe een bestand zippen in PL/SQL?

  4. 5 geweldige bronnen om u te helpen uw databasebewakingsrol te verbeteren