Тази статия разглежда разликата между 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 | +----------+----------+
Така че е добре, стига и двата аргумента да са от един и същи тип (стойности за час или дата и час).