Две функции за дата, включени в MySQL, са DATEDIFF()
и TIMEDIFF()
.
И двете функции правят едно и също нещо, но с някои значими разлики.
Следната таблица обобщава разликата между тези две функции:
DATEDIFF() | TIMEDIFF() |
---|---|
Резултатът се изразява като стойност в дни. | Резултатът се изразява като времева стойност. |
Сравнява само стойността на датата на своите аргументи. | Сравнява времевата стойност на своите аргументи. |
Приема изрази за дата или час. | Приема изрази за час или дата и час. |
И двата аргумента могат да бъдат от различен тип (дата или дата и час). | И двата аргумента трябва да са от един и същи тип (или час, или дата и час). |
Пример 1 – Основна разлика
Ето пример, който демонстрира основната разлика между тези функции.
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';
Резултат:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 24:00:00 | +----------+----------+
Така че можем да видим, че DATEDIFF()
върна 1
, което означава „1 ден“ и TIMEDIFF()
върнати 24:00:00
което е времевото представяне на точно 1 ден.
Пример 2 – Посочване на времева стойност
Нека видим какво ще се случи, ако увеличим стойността на времето на една от променливите.
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';
Резултат:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | 36:15:35 | +----------+----------+
Така че DATEDIFF()
връща същия резултат като в предишния пример. Това е така, защото сравнява само стойностите на датата (игнорира всички стойности за време).
TIMEDIFF()
функцията, от друга страна, сравнява времето и следователно връща по-точен резултат. Показва ни, че има 36 часа, 15 минути и 35 секунди между двете стойности за дата и час.
Пример 3 – Неправилни типове аргументи
Ето пример за това какво се случва, когато подадете грешни типове аргументи на всяка функция.
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';
Резултат:
+---------------+---------------+---------------+---------------+ | DATEDIFF Date | DATEDIFF Time | TIMEDIFF Date | TIMEDIFF Time | +---------------+---------------+---------------+---------------+ | 1 | NULL | 00:00:00 | 12:15:35 | +---------------+---------------+---------------+---------------+
Първият и последният резултат са добре, тъй като са предадени правилните типове аргументи. Средните два резултата обаче имат грешен тип данни и следователно правилният резултат не може да бъде изчислен.
Пример 4 – Смесени типове аргументи
Ето какво се случва, ако предоставите два различни типа данни за всяка функция.
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';
Резултат:
+----------+----------+ | DATEDIFF | TIMEDIFF | +----------+----------+ | 1 | NULL | +----------+----------+
Така че можем да видим, че DATEDIFF()
се справя добре със смесените типове данни (стига да са или дата, или дата и час).
Въпреки това, 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 | +----------+----------+