Två datumfunktioner som ingår i MySQL är DATEDIFF()
och TIMEDIFF()
.
Båda funktionerna gör en liknande sak, men med några betydelsefulla skillnader.
Följande tabell sammanfattar skillnaden mellan dessa två funktioner:
DATEDIFF() | TIMEDIFF() |
---|---|
Resultatet uttrycks som ett värde i dagar. | Resultatet uttrycks som ett tidsvärde. |
Jämför endast datumvärdet för dess argument. | Jämför tidsvärdet för dess argument. |
Accepterar datum- eller datum-och-tid-uttryck. | Accepterar uttryck för tid eller datum och tid. |
Båda argumenten kan vara av olika typ (datum eller datum-och-tid). | Båda argumenten måste vara av samma typ (antingen tid eller datum och tid). |
Exempel 1 – Grundläggande skillnad
Här är ett exempel som visar den grundläggande skillnaden mellan dessa funktioner.
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';
Resultat:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 24:00:00 | +----------+----------+
Så vi kan se att DATEDIFF()
returnerade 1
, vilket betyder "1 dag", och TIMEDIFF()
returnerade 24:00:00
vilket är tidsrepresentationen av exakt 1 dag.
Exempel 2 – Ange ett tidsvärde
Låt oss se vad som händer om vi ökar tidsvärdet för en av variablerna.
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';
Resultat:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 36:15:35 | +----------+----------+
Alltså DATEDIFF()
returnerar samma resultat som i föregående exempel. Detta beror på att den bara jämför datumvärdena (den ignorerar alla tidsvärden).
TIMEDIFF()
funktion, å andra sidan, jämför tiden, och därför returnerar den ett mer exakt resultat. Det visar oss att det är 36 timmar, 15 minuter och 35 sekunder mellan de två datum- och tidvärdena.
Exempel 3 – Felaktiga argumenttyper
Här är ett exempel på vad som händer när du skickar fel argumenttyper till varje funktion.
SET @date1 = '2010-10-11', @date2 = '2010-10-10', @time1 = '12:15:35', @time2 = '00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF Date', DATEDIFF(@time1, @time2) AS 'DATEDIFF Time', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date', TIMEDIFF(@time1, @time2) AS 'TIMEDIFF Time';
Resultat:
+---------------+---------------+---------------+---------------+ | DATEDIFF Date | DATEDIFF Time | TIMEDIFF Date | TIMEDIFF Time | +---------------+---------------+---------------+---------------+ | 1 | NULL | 00:00:00 | 12:15:35 | +---------------+---------------+---------------+---------------+
De första och sista resultaten är bra, eftersom de korrekta argumenttyperna skickades in. De två mittersta resultaten hade dock fel datatyp och därför kunde det korrekta resultatet inte beräknas.
Exempel 4 – Blandade argumenttyper
Det här är vad som händer om du tillhandahåller två olika datatyper till varje funktion.
SET @thedate = '2010-10-11', @thetime = '12:15:35', @thedatetime = '2010-10-10 00:00:00'; SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF';
Resultat:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | NULL | +----------+----------+
Så vi kan se att DATEDIFF()
hanterar blandade datatyper bra (så länge de är antingen datum eller datum och tid).
Men TIMEDIFF()
kräver att båda argumenten är av samma typ, så vi får NULL
, även om båda argumenten är av en typ som funktionen stöder (tid och datum-och-tid).
Vi kan bekräfta att båda typerna faktiskt stöds av denna funktion med följande exempel:
SET @thetime1 = '12:15:35', @thetime2 = '10:15:35', @thedatetime1 = '2010-10-12 00:00:00', @thedatetime2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@thetime1, @thetime2) AS 'time', TIMEDIFF(@thedatetime1, @thedatetime2) AS 'datetime';
Resultat:
+----------+----------+ | time | datetime | +----------+----------+ | 02:00:00 | 48:00:00 | +----------+----------+