sql >> Database teknologi >  >> RDS >> Mysql

MySQL TIMEDIFF() vs TIMESTAMPDIFF():Hvad er forskellen?

Denne artikel ser på forskellen mellem MySQL TIMEDIFF() og TIMESTAMPDIFF() funktioner.

Begge funktioner gør det samme, men der er nogle væsentlige forskelle mellem de to.

Følgende tabel opsummerer forskellen mellem disse to funktioner:

TIMEDIFF() TIMESTAMPDIFF()
Kræver 2 argumenter. Kræver 3 argumenter.
Trækker det 2. argument fra det 1. (dato1 − dato2). Trækker det 2. argument fra det 3. (dato2 − dato1).
Resultatet er udtrykt som en tidsværdi (og det har begrænsningerne for tidsdatatypen). Resultatet er et heltal, udtrykt ved et antal enheder som angivet af det første argument.
Accepterer udtryk for klokkeslæt eller dato og klokkeslæt. Accepterer dato- eller dato-tidsudtryk.
Begge argumenter skal være af samme type (enten tid eller dato). Begge argumenter kan være af forskellig type (dato eller datetime).

Eksempel 1 – Grundlæggende forskel

Her er et eksempel, der viser den grundlæggende forskel mellem disse 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 den TIMEEDIFF() returnerede en tidsværdi og TIMESTAMPDIFF() returnerede et heltal.

Også TIMEEDIFF() trak den 2. dato fra den 1., mens TIMESTAMPDIFF() trukket 1. dato fra 2.

Eksempel 2 – Ændring af enheden

Som nævnt, TIMESTAMPDIFF() giver os mulighed for at angive, hvilken enhed vi skal repræsentere resultatet i. Her er nogle eksempler:

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 her er hvad der sker, hvis vi bruger en enhed, der er større end den faktiske tidsforskel:

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 dette tilfælde var tidsforskellen ikke stor nok til at påvirke uge- eller månedsværdierne.

Eksempel 3 – Forkerte argumenttyper

Her er et eksempel på, hvad der sker, når du sender de forkerte argumenttyper til hver 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() understøtter ikke datatypen 'dato', og derfor returnerer den 00:00:00 .

Og TIMESTAMPDIFF() Funktionen understøtter ikke datatypen 'tid', så den returnerer NULL .

Eksempel 4 – Blandede argumenttyper

Her er, hvad der sker, hvis du angiver to forskellige datatyper til hver 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 den TIMESTAMPDIFF() håndterer blandede datatyper fint (så længe de enten er dato eller dato-og-klokkeslæt).

Dog TIMEDIFF() kræver at begge argumenter er af samme type, så vi får NULL , selvom begge argumenter er af en type, som funktionen understøtter (tid og dato).

Vi kan bekræfte, at begge typer faktisk understøttes af denne funktion med følgende eksempel:

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 er fint, så længe begge argumenter er af samme type (enten klokkeslæt eller datetime-værdier).


  1. Bedste type indeksering, når der er LIKE-klausul

  2. jeg har en Android app, der henter data fra sqlite og viser dataene i BaseAdapter .. hvad er den bedste måde ??

  3. MySQL konverter timediff output til dag, time, minut, sekund format

  4. CTE-fejl:Typerne matcher ikke mellem ankeret og den rekursive del