I SQL Server kan du bruge T-SQL DATEDIFF()
funktion for at returnere forskellen mellem to datoer/klokkeslæt. Det virker på ethvert udtryk, der kan løses til et tidspunkt , dato , smalldatetime , datotid , datetime2 , eller datotidsforskydning værdi.
Denne artikel giver eksempler på DATEDIFF()
funktion i SQL Server.
Syntaks
Først her er syntaksen:
DATEDIFF ( datepart , startdate , enddate )
Hvor datepart er den del af datoen, du vil sammenligne. startdato er den første dato og slutdato er slutdatoen.
Måden det fungerer på er, at det returnerer antallet (som en signeret heltalsværdi) af den angivne datepart grænser krydset mellem den angivne startdato og slutdato .
Eksempel 1
Her er et grundlæggende eksempel, hvor vi finder ud af antallet af dage mellem to datoer:
SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;
Resultat:
+----------+ | Result | |----------| | 365 | +----------+
Eksempel 2
Her er et andet eksempel, hvor jeg erklærer to variable og tildeler to forskellige datoer til dem (jeg bruger DATEADD()
for at tilføje 1 år til den første dato). Jeg bruger derefter DATEDIFF()
for at returnere forskellige datodele for denne dato:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1, @date1); SELECT DATEDIFF( year, @date1, @date2 ) AS Years, DATEDIFF( quarter, @date1, @date2 ) AS Quarters, DATEDIFF( month, @date1, @date2 ) AS Months, DATEDIFF( week, @date1, @date2 ) AS Weeks, DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF( day, @date1, @date2 ) AS Days;
Resultat:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1 | 4 | 12 | 53 | 366 | 366 | +---------+------------+----------+---------+-------------+--------+
Eksempel 3
Som nævnt kan du også returnere tidsdelene mellem datoerne. Her er et eksempel på returnering af antallet af timer, minutter og sekunder mellem dato-/tidsværdierne:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1); SELECT DATEDIFF( hour, @date1, @date2 ) AS Hours, DATEDIFF( minute, @date1, @date2 ) AS Minutes, DATEDIFF( second, @date1, @date2 ) AS Seconds;
Resultat:
+---------+-----------+-----------+ | Hours | Minutes | Seconds | |---------+-----------+-----------| | 1 | 60 | 3600 | +---------+-----------+-----------+
Eksempel 4
Og her er et eksempel på at få antallet af millisekunder, mikrosekunder og nanosekunder mellem to dato/tidsværdier:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;
Resultat:
+----------------+----------------+---------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+----------------+---------------| | 1 | 1000 | 1000000 | +----------------+----------------+---------------+
Eksempel 5 – Fejl!
Hvis du forsøger at gøre noget ekstremt, som at returnere antallet af nanosekunder om 100 år, får du en fejl. Dette er fordi DATEDIFF()
returnerer en int værdi, og der er flere nanosekunder på 100 år end int datatype kan håndtere.
Så her er hvad der sker, hvis du prøver at gøre det:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 100, @date1); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;
Resultat:
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.
Heldigvis, hvis du virkelig skal finde ud af, hvor mange nanosekunder der er om 100 år, kan du bruge DATEDIFF_BIG()
funktion i stedet for. Denne funktion returnerer en bigint med fortegn datatype, som giver dig mulighed for at returnere meget større værdier end DATEDIFF()
kan.
Eksempel 6 – Få mærkelige resultater?
Resultaterne du får fra DATEDIFF()
kan nogle gange se helt forkert ud, hvis du ikke ved, hvordan funktionen rent faktisk fungerer.
For eksempel:
DECLARE @startdate datetime2 = '2016-01-01 00:00:00.0000000', @enddate datetime2 = '2016-12-31 23:59:59.9999999'; SELECT DATEDIFF(day, @startdate, @enddate) Days, DATEDIFF(year, @startdate, @enddate) Years;
Resultat:
+--------+---------+ | Days | Years | |--------+---------| | 365 | 0 | +--------+---------+
Hvis du ikke ved hvordan DATEDIFF()
faktisk virker, kan dette resultat se så forkert ud, at du ville blive tilgivet for at antage, at det er en fejl. Men det er ikke en fejl.
Tjek DATEDIFF() Returnerer forkerte resultater i SQL Server? Læs dette. for at se dette eksempel og andre tilfælde, hvor resultaterne kan se helt forkerte ud, men være helt korrekte (og for at få en forklaring på, hvorfor de ser ud, som de gør).
Et af eksemplerne på den side er nok værd at nævne igen her. DATEDIFF()
ignorerer faktisk din SET DATEFIRST
værdi. Dette kan resultere i uventede resultater, især hvis du er i en kultur, der ikke bruger søndag som den første dag i ugen. Tjek denne løsning for DATEDIFF() Ignorer SET DATEFIRST i SQL Server, hvis du tror, at dette kan påvirke dig.