Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL TIMEDIFF() срещу TIMESTAMPDIFF():Каква е разликата?

Тази статия разглежда разликата между MySQL TIMEDIFF() и TIMESTAMPDIFF() функции.

И двете функции правят едно и също нещо, но има някои значителни разлики между двете.

Следната таблица обобщава разликата между тези две функции:

TIMEDIFF() TIMESTAMPDIFF()
Изисква 2 аргумента. Изисква 3 аргумента.
Изважда 2-ия аргумент от 1-ия (дата1 − дата2). Изважда втория аргумент от третия (дата2 − дата1).
Резултатът се изразява като стойност за време (и има ограниченията на типа данни за време). Резултатът е цяло число, изразено с определен брой единици, както е предоставено от първия аргумент.
Приема изрази за време или дата и час. Приема изрази за дата или час.
И двата аргумента трябва да са от един и същи тип (или час, или дата и час). И двата аргумента могат да бъдат от различен тип (дата или дата и час).

Пример 1 – Основна разлика

Ето пример, който демонстрира основната разлика между тези функции.

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';

Резултат:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| 24:00:00 |           -24 |
+----------+---------------+

Така че можем да видим, че TIMEEDIFF() върна стойност за време и TIMESTAMPDIFF() върна цяло число.

Също така, TIMEEDIFF() извади 2-рата дата от 1-вата, докато TIMESTAMPDIFF() извади 1-ва дата от 2-ра.

Пример 2 – Смяна на модула

Както споменахме, TIMESTAMPDIFF() ни позволява да посочим в коя единица да представим резултата. Ето няколко примера:

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';

Резултат:

+----------+-------+---------+---------+
| TIMEDIFF | Hours | Minutes | Seconds |
+----------+-------+---------+---------+
| 36:15:35 |   -36 |   -2175 | -130535 |
+----------+-------+---------+---------+

Ето какво се случва обаче, ако използваме единица, която е по-голяма от действителната времева разлика:

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';

Резултат:

+----------+------+-------+--------+
| TIMEDIFF | Days | Weeks | Months |
+----------+------+-------+--------+
| 36:15:35 |   -1 |     0 |      0 |
+----------+------+-------+--------+

В този случай часовата разлика не беше достатъчно голяма, за да повлияе на стойностите за седмицата или месеца.

Пример 3 – Неправилни типове аргументи

Ето пример за това какво се случва, когато подадете грешни типове аргументи на всяка функция.

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';

Резултат:

+---------------+--------------------+
| TIMEDIFF Date | TIMESTAMPDIFF Time |
+---------------+--------------------+
| 00:00:00      |               NULL |
+---------------+--------------------+

TIMEDIFF() не поддържа типа данни „дата“ и затова връща 00:00:00 .

И TIMESTAMPDIFF() функцията не поддържа типа данни „време“, така че връща NULL .

Пример 4 – Смесени типове аргументи

Ето какво се случва, ако предоставите два различни типа данни за всяка функция.

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';

Резултат:

+----------+---------------+
| TIMEDIFF | TIMESTAMPDIFF |
+----------+---------------+
| NULL     |           -24 |
+----------+---------------+

Така че можем да видим, че TIMESTAMPDIFF() се справя добре със смесените типове данни (стига да са или дата, или дата и час).

Въпреки това, TIMEDIFF() изисква и двата аргумента да са от един и същи тип, така че получаваме NULL , въпреки че и двата аргумента са от тип, който функцията поддържа (време и дата и час).

Можем да потвърдим, че и двата типа всъщност се поддържат от тази функция със следния пример:

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';

Резултат:

+----------+----------+
| time     | datetime |
+----------+----------+
| 02:00:00 | 48:00:00 |
+----------+----------+

Така че е добре, стига и двата аргумента да са от един и същи тип (стойности за час или дата и час).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL избира бързо 10 произволни реда от 600K реда

  2. Левещайн:MySQL + PHP

  3. Полетата за дата и час в MySQL и лятно часово време – как да направя справка с допълнителния час?

  4. Как да се свържете с MySQL сървър след инсталиране на XAMPP на Mac OS

  5. Управление на потребителски акаунти, роли, разрешения, удостоверяване PHP и MySQL - част 6