Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL TIMEDIFF() vs TIMESTAMPDIFF():jaka jest różnica?

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).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Napraw „BŁĄD 1222 (21000):Użyte instrukcje SELECT mają inną liczbę kolumn” podczas korzystania z UNION w MySQL

  2. Znajdź najczęstszą wartość w kolumnie SQL

  3. Osiąganie przełączania awaryjnego i powrotu po awarii MySQL na Google Cloud Platform (GCP)

  4. Czy połączenia SQL otwierane za pomocą PDO w PHP muszą być zamknięte?

  5. Preferowany silnik MySQL – MyISAM lub InnoDB