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