Tento článek se zabývá rozdílem mezi MySQL TIMEDIFF()
a TIMESTAMPDIFF()
funkce.
Obě funkce dělají podobnou věc, ale jsou mezi nimi určité významné rozdíly.
Následující tabulka shrnuje rozdíl mezi těmito dvěma funkcemi:
TIMEDIFF() | TIMESTAMPDIFF() |
---|---|
Vyžaduje 2 argumenty. | Vyžaduje 3 argumenty. |
Odečte 2. argument od 1. (datum1 − datum2). | Odečte 2. argument od 3. (datum2 − datum1). |
Výsledek je vyjádřen jako časová hodnota (a má omezení typu časových dat). | Výsledek je celé číslo vyjádřené počtem jednotek podle prvního argumentu. |
Přijímá výrazy času nebo data a času. | Přijímá výrazy datum nebo datum a čas. |
Oba argumenty musí být stejného typu (buď čas nebo datum a čas). | Oba argumenty mohou být různého typu (datum nebo datum a čas). |
Příklad 1 – Základní rozdíl
Zde je příklad, který ukazuje základní rozdíl mezi těmito funkcemi.
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';
Výsledek:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 24:00:00 | -24 | +----------+---------------+
Takže vidíme, že TIMEEDIFF()
vrátil hodnotu času a TIMESTAMPDIFF()
vrátil celé číslo.
Také TIMEEDIFF()
odečetl 2. datum od 1., zatímco TIMESTAMPDIFF()
odečteno 1. datum od 2.
Příklad 2 – Změna jednotky
Jak již bylo zmíněno, TIMESTAMPDIFF()
nám umožňuje určit, ve které jednotce má být výsledek reprezentován. Zde je několik příkladů:
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';
Výsledek:
+----------+-------+---------+---------+ | TIMEDIFF | Hours | Minutes | Seconds | +----------+-------+---------+---------+ | 36:15:35 | -36 | -2175 | -130535 | +----------+-------+---------+---------+
Pokud však použijeme jednotku, která je větší než skutečný časový rozdíl, stane se toto:
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';
Výsledek:
+----------+------+-------+--------+ | TIMEDIFF | Days | Weeks | Months | +----------+------+-------+--------+ | 36:15:35 | -1 | 0 | 0 | +----------+------+-------+--------+
V tomto případě nebyl časový rozdíl dostatečně velký, aby ovlivnil hodnoty týdne nebo měsíce.
Příklad 3 – Nesprávné typy argumentů
Zde je příklad toho, co se stane, když každé funkci předáte nesprávné typy argumentů.
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';
Výsledek:
+---------------+--------------------+ | TIMEDIFF Date | TIMESTAMPDIFF Time | +---------------+--------------------+ | 00:00:00 | NULL | +---------------+--------------------+
TIMEDIFF()
nepodporuje datový typ ‚date‘, a proto vrací 00:00:00
.
A TIMESTAMPDIFF()
funkce nepodporuje datový typ „čas“, takže vrací NULL
.
Příklad 4 – Smíšené typy argumentů
Zde je to, co se stane, když každé funkci poskytnete dva různé datové typy.
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';
Výsledek:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | -24 | +----------+---------------+
Takže vidíme, že TIMESTAMPDIFF()
dobře zvládá smíšené datové typy (pokud se jedná o datum nebo datum a čas).
Nicméně TIMEDIFF()
vyžaduje, aby oba argumenty byly stejného typu, takže dostaneme NULL
, i když oba argumenty jsou typu, který funkce podporuje (čas a datum a čas).
Že jsou oba typy touto funkcí ve skutečnosti podporovány, můžeme potvrdit na následujícím příkladu:
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';
Výsledek:
+----------+----------+ | time | datetime | +----------+----------+ | 02:00:00 | 48:00:00 | +----------+----------+
Takže je to v pořádku, pokud jsou oba argumenty stejného typu (hodnoty času nebo data a času).