Dwie funkcje daty zawarte w MySQL to DATEDIFF()
i TIMEDIFF()
.
Obie funkcje działają podobnie, ale z pewnymi znaczącymi różnicami.
Poniższa tabela podsumowuje różnicę między tymi dwiema funkcjami:
DATEDIFF() | TIMEDIFF() |
---|---|
Wynik jest wyrażony jako wartość w dniach. | Wynik jest wyrażony jako wartość czasu. |
Porównuje tylko wartość daty swoich argumentów. | Porównuje wartość czasu swoich argumentów. |
Akceptuje wyrażenia daty lub daty i czasu. | Akceptuje wyrażenia czasu lub daty i czasu. |
Oba argumenty mogą być różnego typu (data lub data i godzina). | Oba argumenty muszą być tego samego typu (czas lub data i 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 DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';
Wynik:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 24:00:00 | +----------+----------+
Widzimy więc, że DATEDIFF()
zwrócono 1
, co oznacza „1 dzień” i TIMEDIFF()
zwrócono 24:00:00
co jest reprezentacją czasu dokładnie 1 dnia.
Przykład 2 – Określanie wartości czasu
Zobaczmy, co się stanie, jeśli zwiększymy wartość czasu jednej ze zmiennych.
SET @date1 = '2010-10-11 12:15:35', @date2 = '2010-10-10 00:00:00'; SELECT DATEDIFF(@date1, @date2) AS 'DATEDIFF', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF';
Wynik:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 36:15:35 | +----------+----------+
Więc DATEDIFF()
zwraca ten sam wynik, co w poprzednim przykładzie. Dzieje się tak, ponieważ porównuje tylko wartości dat (ignoruje wszelkie wartości czasu).
TIMEDIFF()
Z drugiej strony funkcja porównuje czas i dlatego zwraca dokładniejszy wynik. Pokazuje nam, że między dwiema wartościami daty i czasu jest 36 godzin, 15 minut i 35 sekund.
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 DATEDIFF(@date1, @date2) AS 'DATEDIFF Date', DATEDIFF(@time1, @time2) AS 'DATEDIFF Time', TIMEDIFF(@date1, @date2) AS 'TIMEDIFF Date', TIMEDIFF(@time1, @time2) AS 'TIMEDIFF Time';
Wynik:
+---------------+---------------+---------------+---------------+ | DATEDIFF Date | DATEDIFF Time | TIMEDIFF Date | TIMEDIFF Time | +---------------+---------------+---------------+---------------+ | 1 | NULL | 00:00:00 | 12:15:35 | +---------------+---------------+---------------+---------------+
Pierwszy i ostatni wynik są w porządku, ponieważ przekazano prawidłowe typy argumentów. Jednak dwa środkowe wyniki miały przekazany niewłaściwy typ danych i dlatego nie można było obliczyć prawidłowego wyniku.
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 DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMEDIFF(@thetime, @thedatetime) AS 'TIMEDIFF';
Wynik:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | NULL | +----------+----------+
Widzimy więc, że DATEDIFF()
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 oraz data i 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 | +----------+----------+