sql >> Databasteknik >  >> RDS >> Mysql

MySQL TIMEDIFF() vs TIMESTAMPDIFF():Vad är skillnaden?

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).


  1. PostgreSQL-fel när du försöker skapa ett tillägg

  2. Mysql infoga i 2 tabeller

  3. Fel vid laddning av oci8.so med Ubuntu server 17.04 php 7 och apache2

  4. ER-diagram i IRI Workbench