W tym artykule przyjrzymy się różnicy między dwiema funkcjami MySQL; DATEDIFF()
i TIMESTAMPDIFF()
.
Obie funkcje zwracają różnicę między dwiema datami i/lub godzinami, ale wynik jest inny dla obu funkcji.
Poniższa tabela podsumowuje różnicę między tymi dwiema funkcjami:
DATEDIFF() | TIMESTAMPDIFF() |
---|---|
Wymaga 2 argumentów. | Wymaga 3 argumentów. |
Odejmuje drugi argument od pierwszego (wyraż1 − wyraż2). | Odejmuje drugi argument od trzeciego (wyraż2 − wyraż1). |
Wynik jest wyrażony jako wartość w dniach. | Wynik jest wyrażony jako jednostka podana przez pierwszy argument. |
Może porównywać tylko wartość daty swoich argumentów. | Może porównać datę i godzinę swoich argumentów. |
Przykład 1 – Podstawowa obsługa
Oto przykład, który pokazuje, jak działają te funkcje i jak różnią się wyniki, nawet przy użyciu tej samej jednostki.
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';
Wynik:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+
Zatem obie funkcje zwracają różnicę w dniach, jednak jeden wynik jest dodatni, a drugi ujemny. Dzieje się tak, ponieważ DATEDIFF()
odejmuje drugą datę od pierwszej, podczas gdy TIMESTAMPDIFF()
odejmuje pierwszą datę od drugiej.
Przykład 2 – Zmiana jednostki
Jak pokazuje poprzedni przykład, TIMESTAMPDIFF()
pozwala określić jednostkę, w jakiej mają być zwracane wyniki (w rzeczywistości wymaga określić jednostkę). Z drugiej strony DATEDIFF()
nie pozwala na określenie jednostki. Zwraca wynik tylko w dniach.
Możemy więc zmodyfikować poprzedni przykład tak, aby TIMESTAMPDIFF()
zwraca liczbę godzin zamiast dni:
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';
Wynik:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -24 | +----------+---------------+
Możesz przejść 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';
Wynik:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -86400000000 | +----------+---------------+
Przykład 3 – Precyzja
Dokładność DATEDIFF()
to jeden dzień, a TIMESTAMPDIFF()
może zejść do mikrosekundy. Jednak precyzja TIMESTAMPDIFF()
(i jednostka, którą porównuje) nadal zależy od określonej jednostki.
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';
Wynik:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | 0 | 0 | 23 | 1439 | 86399 | 86399000000 | +----------+------+-------+---------+---------+--------------+
A oto wynik, jeśli zwiększymy drugą datę o jedną sekundę (co przenosi ją na następny dzień):
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';
Wynik:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | -1 | 1 | 24 | 1440 | 86400 | 86400000000 | +----------+------+-------+---------+---------+--------------+
Oto kolejny przykład, tym razem pokazujący, jak to wygląda, gdy zwracamy miesiące, kwartały i lata, gdy różnica wynosi jeden miesiąc (lub 31 dni):
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';
Wynik:
+----------+------+-------+---------+------+ | DATEDIFF | Days | Month | Quarter | Year | +----------+------+-------+---------+------+ | -31 | 31 | 1 | 0 | 0 | +----------+------+-------+---------+------+
Przykład 4 – Niewłaściwe typy argumentów
Obie funkcje zwracają wartość null, jeśli przekazano niewłaściwy typ argumentu.
SET @time1 = '12:15:35', @time2 = '00:00:00'; SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Wynik:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | NULL | +----------+---------------+
Przykład 5 – Mieszane typy argumentów
Obie funkcje umożliwiają podanie daty jako jednego argumentu i daty i godziny jako innego argumentu.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00'; SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Wynik:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+