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

MySQL DATEDIFF() vs TIMESTAMPDIFF():Jaka jest różnica?

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 |
+----------+---------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja UCASE() w MySQL

  2. Jak działa funkcja LPAD() w MySQL

  3. Neo4j - Utwórz węzeł za pomocą Cypher

  4. Jak mogę zabezpieczyć nazwę użytkownika i hasło MySQL przed dekompilacją?

  5. przesyłanie plików php, jak ograniczyć typ przesyłania plików