Database.Guide
On 27 stycznia, 2022 by adminTen artykuł analizuje różnicę między dwoma funkcjami MySQL; DATEDIFF()
i TIMESTAMPDIFF()
.
Obydwie funkcje zwracają różnicę między dwiema datami i/lub czasami, ale wynik jest inny między tymi dwoma funkcjami.
Następująca tabela podsumowuje różnice między tymi dwiema funkcjami:
DATEDIFF() |
TIMESTAMPDIFF() |
---|---|
Wymaga 2 argumentów. | Wymaga 3 argumentów. |
Odejmuje 2. argument od 1. (expr1 – expr2). | Odejmuje 2. argument od 3. (expr2 – expr1). |
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ównywać wartość daty i czasu swoich argumentów. |
Przykład 1 – Podstawowa operacja
Oto przykład, który pokazuje, jak działają te funkcje i jak wyniki są różne, 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 |+----------+---------------+
Więc 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, funkcja TIMESTAMPDIFF()
pozwala określić jednostkę, w jakiej mają być zwracane wyniki (w rzeczywistości wymaga określenia jednostki). Z drugiej strony, DATEDIFF()
nie pozwala na określenie jednostki. Zwraca tylko wynik 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ść 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';
Result:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -86400000000 |+----------+---------------+
Przykład 3 – Precyzja
Precyzja DATEDIFF()
wynosi 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 2. datę o jedną sekundę (co sprowadza ją do następnego dnia):
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 |+----------+------+-------+---------+---------+--------------+
A oto kolejny przykład, tym razem sprawdzają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';
Result:
+----------+------+-------+---------+------+| DATEDIFF | Days | Month | Quarter | Year |+----------+------+-------+---------+------+| -31 | 31 | 1 | 0 | 0 |+----------+------+-------+---------+------+
Przykład 4 – Nieprawidłowe typy argumentów
Obydwie funkcje zwracają wartość null, jeśli zostanie im przekazany nieprawidłowy typ argumentu.
SET @time1 = '12:15:35', @time2 = '00:00:00';SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Result:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| NULL | NULL |+----------+---------------+
Przykład 5 – Mixed Argument Types
Obydwie funkcje pozwalają na przekazanie daty jako jednego argumentu i datetime jako drugiego 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';
Result:
+----------+---------------+| DATEDIFF | TIMESTAMPDIFF |+----------+---------------+| 1 | -1 |+----------+---------------+
.
Dodaj komentarz