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