Tento článek se zabývá rozdílem mezi dvěma funkcemi MySQL; DATEDIFF()
a TIMESTAMPDIFF()
.
Obě funkce vrátí rozdíl mezi dvěma daty a/nebo časy, ale výsledek se mezi těmito dvěma funkcemi liší.
Následující tabulka shrnuje rozdíl mezi těmito dvěma funkcemi:
DATEDIFF() | TIMESTAMPDIFF() |
---|---|
Vyžaduje 2 argumenty. | Vyžaduje 3 argumenty. |
Odečte 2. argument od 1. (výraz1 − výraz2). | Odečte 2. argument od 3. (výraz2 − výraz1). |
Výsledek je vyjádřen jako hodnota ve dnech. | Výsledek je vyjádřen jako jednotka poskytnutá prvním argumentem. |
Může porovnávat pouze hodnotu data svých argumentů. | Může porovnat hodnotu data a času svých argumentů. |
Příklad 1 – Základní operace
Zde je příklad, který ukazuje, jak tyto funkce fungují a jak se výsledky liší, i když používáte stejnou jednotku.
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'TIMESTAMPDIFF';
Výsledek:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+
Obě funkce tedy vrátí rozdíl ve dnech, nicméně jeden výsledek je kladný a druhý záporný. Důvodem je DATEDIFF()
odečte druhé datum od prvního, zatímco TIMESTAMPDIFF()
odečte první datum od druhého.
Příklad 2 – Změna jednotky
Jak ukazuje předchozí příklad, TIMESTAMPDIFF()
umožňuje určit jednotku, jakou mají být výsledky vráceny (ve skutečnosti to vyžaduje můžete určit jednotku). Na druhé straně DATEDIFF()
neumožňuje určit jednotku. Výsledek vrátí pouze ve dnech.
Takže bychom mohli upravit předchozí příklad tak, že TIMESTAMPDIFF()
vrátí počet hodin místo dnů:
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(hour, @date1, @date2) AS 'TIMESTAMPDIFF';
Výsledek:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -24 | +----------+---------------+
Můžete jít až do mikrosekund:
SET @date1 = '2010-10-11 00:00:00', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'TIMESTAMPDIFF';
Výsledek:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -86400000000 | +----------+---------------+
Příklad 3 – Přesnost
Přesnost DATEDIFF()
je jeden den a TIMESTAMPDIFF()
může klesnout na mikrosekundu. Nicméně přesnost TIMESTAMPDIFF()
(a jednotka, kterou porovnává) stále závisí na zadané jednotce.
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-10 23:59:59'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';
Výsledek:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | 0 | 0 | 23 | 1439 | 86399 | 86399000000 | +----------+------+-------+---------+---------+--------------+
A tady je výsledek, pokud zvýšíme 2. datum o jednu sekundu (čímž se přesune na další den):
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-10-11 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(hour, @date1, @date2) AS 'Hours', TIMESTAMPDIFF(minute, @date1, @date2) AS 'Minutes', TIMESTAMPDIFF(second, @date1, @date2) AS 'Seconds', TIMESTAMPDIFF(microsecond, @date1, @date2) AS 'Microseconds';
Výsledek:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | -1 | 1 | 24 | 1440 | 86400 | 86400000000 | +----------+------+-------+---------+---------+--------------+
Zde je další příklad, tentokrát jak to vypadá, když vrátíme měsíce, čtvrtletí a roky, když je rozdíl jeden měsíc (nebo 31 dní):
SET @date1 = '2010-10-10 00:00:00', @date2 = '2010-11-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @date1, @date2) AS 'Days', TIMESTAMPDIFF(month, @date1, @date2) AS 'Month', TIMESTAMPDIFF(quarter, @date1, @date2) AS 'Quarter', TIMESTAMPDIFF(year, @date1, @date2) AS 'Year';
Výsledek:
+----------+------+-------+---------+------+ | DATEDIFF | Days | Month | Quarter | Year | +----------+------+-------+---------+------+ | -31 | 31 | 1 | 0 | 0 | +----------+------+-------+---------+------+
Příklad 4 – Nesprávné typy argumentů
Obě funkce vrátí hodnotu null, pokud je jim předán nesprávný typ argumentu.
SET @time1 = '12:15:35', @time2 = '00:00:00'; SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Výsledek:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | NULL | +----------+---------------+
Příklad 5 – Smíšené typy argumentů
Obě funkce umožňují zadat datum jako jeden argument a datum a čas jako další argument.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00'; SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Výsledek:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+