W tym artykule przyjrzymy się różnicy między TIMEDIFF()
MySQL i TIMESTAMPDIFF()
funkcje.
Obie funkcje działają podobnie, ale istnieją między nimi pewne znaczące różnice.
Poniższa tabela podsumowuje różnicę między tymi dwiema funkcjami:
TIMEDIFF() | TIMESTAMPDIFF() |
---|---|
Wymaga 2 argumentów. | Wymaga 3 argumentów. |
Odejmuje drugi argument od pierwszego (data1 – data2). | Odejmuje drugi argument od trzeciego (data2 − data1). |
Wynik jest wyrażony jako wartość czasu (i ma ograniczenia typu danych czasu). | Wynik jest liczbą całkowitą wyrażoną przez liczbę jednostek podaną w pierwszym argumencie. |
Akceptuje wyrażenia czasu lub daty i godziny. | Akceptuje wyrażenia daty lub daty i godziny. |
Oba argumenty muszą być tego samego typu (czas lub data/godzina). | Oba argumenty mogą być różnego typu (data lub data/godzina). |
Przykład 1 – podstawowa różnica
Oto przykład, który pokazuje podstawową różnicę między tymi funkcjami.
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';
Wynik:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 24:00:00 | -24 | +----------+---------------+
Widzimy więc, że TIMEEDIFF()
zwrócił wartość czasu, a TIMESTAMPDIFF()
zwrócił liczbę całkowitą.
Również TIMEEDIFF()
odjął drugą datę od pierwszej, podczas gdy TIMESTAMPDIFF()
odjęto pierwszą datę od drugiej.
Przykład 2 – Zmiana jednostki
Jak wspomniano, TIMESTAMPDIFF()
pozwala nam określić, w jakiej jednostce ma być reprezentowany wynik. Oto kilka przykładów:
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';
Wynik:
+----------+-------+---------+---------+ | TIMEDIFF | Hours | Minutes | Seconds | +----------+-------+---------+---------+ | 36:15:35 | -36 | -2175 | -130535 | +----------+-------+---------+---------+
Oto jednak, co się stanie, jeśli użyjemy jednostki, która jest większa niż rzeczywista różnica czasu:
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';
Wynik:
+----------+------+-------+--------+ | TIMEDIFF | Days | Weeks | Months | +----------+------+-------+--------+ | 36:15:35 | -1 | 0 | 0 | +----------+------+-------+--------+
W tym przypadku różnica czasu nie była wystarczająco duża, aby wpłynąć na wartości tygodnia lub miesiąca.
Przykład 3 – Niewłaściwe typy argumentów
Oto przykład tego, co się dzieje, gdy przekazujesz nieprawidłowe typy argumentów do każdej funkcji.
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';
Wynik:
+---------------+--------------------+ | TIMEDIFF Date | TIMESTAMPDIFF Time | +---------------+--------------------+ | 00:00:00 | NULL | +---------------+--------------------+
TIMEDIFF()
nie obsługuje typu danych „data”, więc zwraca 00:00:00
.
Oraz TIMESTAMPDIFF()
funkcja nie obsługuje typu danych „czas”, więc zwraca NULL
.
Przykład 4 – Mieszane typy argumentów
Oto, co się stanie, jeśli do każdej funkcji podasz dwa różne typy danych.
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';
Wynik:
+----------+---------------+ | TIMEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | -24 | +----------+---------------+
Widzimy więc, że TIMESTAMPDIFF()
dobrze radzi sobie z mieszanymi typami danych (o ile są to data lub data i godzina).
Jednak TIMEDIFF()
wymaga, aby oba argumenty były tego samego typu, więc otrzymujemy NULL
, mimo że oba argumenty są typu obsługiwanego przez funkcję (czas i data/godzina).
Możemy potwierdzić, że oba typy są w rzeczywistości obsługiwane przez tę funkcję na następującym przykładzie:
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';
Wynik:
+----------+----------+ | time | datetime | +----------+----------+ | 02:00:00 | 48:00:00 | +----------+----------+
Więc jest w porządku, o ile oba argumenty są tego samego typu (czas lub data-godzina).