sql >> Databasteknik >  >> RDS >> Sqlserver

DATEDIFF() vs DATEDIFF_BIG() i SQL Server:Vad är skillnaden?

Om du någonsin har behövt hitta skillnaden mellan två datum i SQL Server kan du ha använt DATEDIFF() fungera. Den här funktionen returnerar tiden mellan två datum med en datumdel specificerat av dig. Du kan till exempel använda det för att returnera antalet dagar mellan datum 1 och datum 2. Du kan också få det att returnera antalet minuter, sekunder, månader, år osv.

DATEDIFF_BIG() funktion fungerar exakt på samma sätt, men med en subtil skillnad:dess returdatatyp.

Så skillnaden mellan dessa två funktioner är datatypen för deras returvärde.

  • DATEDIFF() returnerar ett signerat heltal (int )
  • DATEDIFF_BIG() returnerar ett signerat stort heltal (bigint )

I vissa fall behöver du inte returnera en bigint data typ. Detta representerar ett mycket stort antal, och om du använder DATEDIFF() eller DATEDIFF_BIG() kommer inte att göra någon skillnad (förutom lagringskrav – int använder 4 byte, bigint använder 8 byte).

Men om du stöter på följande fel:

Datediff-funktionen resulterade i ett spill. Antalet datumdelar som separerar två datum/tid-instanser är för stort. Försök att använda datediff med en mindre exakt datumdel.

Det beror på att returvärdet är för stort.

I det här fallet måste du göra en av tre saker:

  • Använd en kortare tidsperiod. Till exempel, istället för att försöka returnera antalet millisekunder på 26 dagar, försök 25.
  • Använd en mindre exakt datumdel . Till exempel, istället för att försöka returnera antalet millisekunder, försök med bara sekunder.
  • Använd DATEDIFF_BIG() funktion istället.

Ibland är de två första alternativen inte lämpliga. Om du behöver en tidsperiod på 26 dagar, kommer 25 inte att minska det. Och om du behöver en Unix-tidsstämpel efter 2038, kommer du att stöta på 2038-problem om du använder DATEDIFF() .

I alla fall, DATEDIFF_BIG() funktionen tillåter ett mycket större resultatområde än DATEDIFF() .

Exempel

Här är två exempel för att visa både likheterna och skillnaderna mellan DATEDIFF() och DATEDIFF_BIG() .

Samma resultat

Här är ett exempel där båda funktionerna ger samma resultat:

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;

Resultat:

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

Som förväntat returnerar båda funktionerna samma resultat. Detta beror på att returvärdet är tillräckligt litet för att tillgodose båda bigint och int datatyper. Allt vi gjorde var att returnera antalet millisekunder på 1 sekund.

Annorlunda resultat

Nu är det här vad som händer om vi ökar tidsramen till 1000 år.

Först, här är vad som händer när vi använder DATEDIFF() :

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

Resultat:

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.

Så här gör du nu DATEDIFF_BIG() hanterar det:

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

Resultat:

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

Att returnera antalet millisekunder på 1000 år var för mycket för en int , men det är inte ett problem för en stor .


  1. Spåra hög tillgänglighet för PostgreSQL med hjärtslag

  2. Fix:"operatör finns inte:heltal || heltal” i PostgreSQL

  3. Hur kan en LEFT OUTER JOIN returnera fler poster än vad som finns i den vänstra tabellen?

  4. Dela upp en miljardradstabell med fotbollsdata med hjälp av datakontext