Den här artikeln tittar på skillnaden mellan MySQL TIMEDIFF()
och TIMESTAMPDIFF()
funktioner.
Båda funktionerna gör en liknande sak, men det finns några betydande skillnader mellan de två.
Följande tabell sammanfattar skillnaden mellan dessa två funktioner:
TIMEDIFF() | TIMESTAMPDIFF() |
---|---|
Kräver 2 argument. | Kräver 3 argument. |
Subtraherar det andra argumentet från det första (datum1 − datum2). | Subtraherar det 2:a argumentet från det 3:e (datum2 − datum1). |
Resultatet uttrycks som ett tidsvärde (och det har begränsningarna för tidsdatatypen). | Resultatet är ett heltal, uttryckt av ett antal enheter enligt det första argumentet. |
Accepterar tid- eller datumuttryck. | Accepterar uttryck för datum eller datum och tid. |
Båda argumenten måste vara av samma typ (antingen tid eller datum och tid). | Båda argumenten kan vara av olika typ (datum eller datumtid). |
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 TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';
Resultat:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 24:00:00 | -24 | +----------+---------------+
Så vi kan se att TIMEEDIFF()
returnerade ett tidsvärde och TIMESTAMPDIFF()
returnerade ett heltal.
Även TIMEEDIFF()
subtraherade det andra datumet från det första, medan TIMESTAMPDIFF()
subtraherade det första datumet från det andra.
Exempel 2 – Byta enhet
Som nämnts, TIMESTAMPDIFF()
låter oss specificera vilken enhet resultatet ska representeras i. Här är några exempel:
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds';
Resultat:
+----------+-------+---------+---------+ | TIMEDIFF | Hours | Minutes | Seconds | +----------+-------+---------+---------+ | 36:15:35 | -36 | -2175 | -130535 | +----------+-------+---------+---------+
Men här är vad som händer om vi använder en enhet som är större än den faktiska tidsskillnaden:
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT TIMEDIFF(@date1, @date2) AS 'TIMEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(week, @date1, @date2) AS 'Weeks', TIMESTAMPDIFF(month, @date1, @date2) AS 'Months';
Resultat:
+----------+------+-------+--------+ | TIMEDIFF | Days | Weeks | Months | +----------+------+-------+--------+ | 36:15:35 | -1 | 0 | 0 | +----------+------+-------+--------+
I det här fallet var tidsskillnaden inte tillräckligt stor för att påverka vecko- eller månadsvä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 TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date', TIMESTAMPDIFF(hour, @time1, @time2) AS 'TIMESTAMPDIFF Time';
Resultat:
+---------------+--------------------+ | TIMEDIFF Date | TIMESTAMPDIFF Time | +---------------+--------------------+ | 00:00:00 | NULL | +---------------+--------------------+
TIMEDIFF()
stöder inte datatypen "datum", och därför returnerar den 00:00:00
.
Och TIMESTAMPDIFF()
Funktionen stöder inte datatypen "tid", så den returnerar NULL
.
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 TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF', TIMESTAMPDIFF(hour, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Resultat:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | -24 | +----------+---------------+
Så vi kan se att TIMESTAMPDIFF()
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 | +----------+----------+
Så det är bra, så länge som båda argumenten är av samma typ (antingen tid eller datum och tid).