Database.Guide
On 27 ledna, 2022 by adminTento článek se zabývá rozdílem mezi dvěma funkcemi MySQL: DATEDIFF()
a TIMESTAMPDIFF()
.
Obě funkce vracejí rozdíl mezi dvěma daty a/nebo časy, ale výsledek se u obou funkcí liší.
Následující tabulka shrnuje rozdíl mezi těmito dvěma funkcemi:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
Vyžaduje 2 argumenty. | Vyžaduje 3 argumenty. |
Odčítá 2. argument od 1. (expr1 – expr2). | Odčítá 2. argument od 3. (expr2 – expr1). |
Výsledek je vyjádřen jako hodnota ve dnech. | Výsledek je vyjádřen jako jednotka daná prvním argumentem. |
Může porovnat pouze hodnotu data svých argumentů. | Může porovnat hodnotu data a času svých argumentů. |
Příklad 1 – Základní operace
Tady je příklad, který ukazuje, jak tyto funkce pracují a jak se liší výsledky, i když používají 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 vracejí rozdíl ve dnech, avšak jeden výsledek je kladný a druhý záporný. Je to proto, že DATEDIFF()
odečítá druhé datum od prvního, zatímco TIMESTAMPDIFF()
odečítá první datum od druhého.
Příklad 2 – Změna jednotky
Jak ukazuje předchozí příklad, TIMESTAMPDIFF()
umožňuje zadat jednotku, ve které má být výsledek vrácen (ve skutečnosti zadání jednotky vyžaduje). Naproti tomu DATEDIFF()
zadání jednotky neumožňuje. Vrací pouze výsledek ve dnech.
Můžeme tedy předchozí příklad upravit 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ž na mikrosekundy:
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 jít až na mikrosekundy. Přesnost TIMESTAMPDIFF()
(a jednotka, kterou porovnává) však 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 zde je výsledek, pokud zvýšíme 2. datum o jednu sekundu (čímž se dostane 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 |+----------+------+-------+---------+---------+--------------+
Tady je další příklad, tentokrát se podíváme, jak to vypadá, když vrací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 – špatné typy argumentů
Obě funkce vracejí nulu, pokud jim předáme špatný 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 jako jeden argument datum a jako druhý argument datumový čas.
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 |+----------+---------------+
.
Napsat komentář