sql >> Database teknologi >  >> RDS >> Sqlserver

DATEDIFF() vs DATEDIFF_BIG() i SQL Server:Hvad er forskellen?

Hvis du nogensinde har haft brug for at finde forskellen mellem to datoer i SQL Server, har du muligvis brugt DATEDIFF() fungere. Denne funktion returnerer mængden af ​​tid mellem to datoer ved hjælp af en datepart specificeret af dig. Du kan f.eks. bruge det til at returnere antallet af dage mellem dato 1 og dato 2. Du kan også få det til at returnere antallet af minutter, sekunder, måneder, år osv.

DATEDIFF_BIG() funktion fungerer nøjagtigt på samme måde, men med en subtil forskel:Dens returdatatype.

Så forskellen mellem disse to funktioner er datatypen for deres returværdi.

  • DATEDIFF() returnerer et signeret heltal (int )
  • DATEDIFF_BIG() returnerer et signeret stort heltal (bigint )

I nogle tilfælde vil du ikke have meget behov for at returnere en bigint datatype. Dette repræsenterer et meget stort tal, og om du bruger DATEDIFF() eller DATEDIFF_BIG() vil ikke gøre nogen forskel (bortset fra lagerkrav – int bruger 4 bytes, bigint bruger 8 bytes).

Men hvis du støder på følgende fejl:

Datediff-funktionen resulterede i et overløb. Antallet af datodele, der adskiller to dato-/tidsforekomster, er for stort. Prøv at bruge datediff med en mindre præcis datodel.

Det er fordi returværdien er for stor.

I dette tilfælde skal du gøre en af ​​tre ting:

  • Brug en kortere tidsperiode. For eksempel, i stedet for at prøve at returnere antallet af millisekunder på 26 dage, prøv 25.
  • Brug en mindre præcis datodel . For eksempel, i stedet for at prøve at returnere antallet af millisekunder, prøv det med blot sekunder.
  • Brug DATEDIFF_BIG() funktion i stedet for.

Nogle gange er de to første muligheder ikke egnede. Hvis du har brug for et tidsrum på 26 dage, vil 25 ikke skære det ned. Og hvis du har brug for et Unix-tidsstempel efter 2038, vil du støde på 2038-problemer, hvis du bruger DATEDIFF() .

Under alle omstændigheder er DATEDIFF_BIG() funktion giver mulighed for et meget større udvalg af resultater end DATEDIFF() .

Eksempel

Her er to eksempler for at demonstrere både lighederne og forskellene mellem DATEDIFF() og DATEDIFF_BIG() .

Samme resultat

Her er et eksempel, hvor begge funktioner giver det samme 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 forventet returnerer begge funktioner det samme resultat. Dette skyldes, at returværdien er lille nok til at tage højde for både bigint og int datatyper. Det eneste, vi gjorde, var at returnere antallet af millisekunder på 1 sekund.

Andet resultat

Her er hvad der sker, hvis vi øger tidsrammen til 1000 år.

For det første, her er, hvad der sker, når vi bruger 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.

Nu, her er hvordan DATEDIFF_BIG() håndterer 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

At returnere antallet af millisekunder i 1000 år var for meget for en int , men det er ikke et problem for en stor .


  1. Hvordan får man rækkeantal i sqlite ved hjælp af Android?

  2. 11 måder at hente en primær nøgle i SQL Server (T-SQL eksempler)

  3. Administrer MySQL med phpMyAdmin på Ubuntu 10.10 (Maverick)

  4. Brug af jsonb_set() til at opdatere specifik jsonb-arrayværdi