Тази статия разглежда разликата между две MySQL функции; DATEDIFF()
и TIMESTAMPDIFF()
.
И двете функции връщат разликата между две дати и/или часа, но резултатът е различен между двете функции.
Следната таблица обобщава разликата между тези две функции:
DATEDIFF() | TIMESTAMPDIFF() |
---|---|
Изисква 2 аргумента. | Изисква 3 аргумента. |
Изважда 2-ия аргумент от 1-ия (expr1 − expr2). | Изважда втория аргумент от третия (expr2 − expr1). |
Резултатът се изразява като стойност в дни. | Резултатът се изразява като единица, предоставена от първия аргумент. |
Може да сравнява само стойността на датата на своите аргументи. | Може да сравнява стойността на датата и часа на своите аргументи. |
Пример 1 – Основна операция
Ето пример, който демонстрира как работят тези функции и как резултатите са различни, дори когато използвате едно и също устройство.
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';
Резултат:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+
И двете функции връщат разликата в дни, но единият резултат е положителен, а другият отрицателен. Това е така, защото DATEDIFF()
изважда втората дата от първата, докато TIMESTAMPDIFF()
изважда първата дата от втората.
Пример 2 – Смяна на модула
Както показва предишният пример, TIMESTAMPDIFF()
ви позволява да зададете единица за връщане на резултатите (всъщност това изисква вие да посочите единицата). От друга страна, DATEDIFF()
не ви позволява да посочите единица. Връща резултата само за дни.
Така че бихме могли да модифицираме предишния пример, така че TIMESTAMPDIFF()
връща броя на часовете вместо дните:
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';
Резултат:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -24 | +----------+---------------+
Можете да стигнете чак до микросекунди:
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';
Резултат:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -86400000000 | +----------+---------------+
Пример 3 – Прецизност
Прецизността на DATEDIFF()
е един ден и TIMESTAMPDIFF()
може да се сведе до микросекунда. Въпреки това точността на TIMESTAMPDIFF()
(и единицата, която сравнява) все още зависи от посочената единица.
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';
Резултат:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | 0 | 0 | 23 | 1439 | 86399 | 86399000000 | +----------+------+-------+---------+---------+--------------+
И ето резултата, ако увеличим 2-та дата с една секунда (което я отвежда до следващия ден):
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';
Резултат:
+----------+------+-------+---------+---------+--------------+ | DATEDIFF | Days | Hours | Minutes | Seconds | Microseconds | +----------+------+-------+---------+---------+--------------+ | -1 | 1 | 24 | 1440 | 86400 | 86400000000 | +----------+------+-------+---------+---------+--------------+
Ето още един пример, този път виждайки как изглежда, когато връщаме месеци, тримесечия и години, когато разликата е един месец (или 31 дни):
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';
Резултат:
+----------+------+-------+---------+------+ | DATEDIFF | Days | Month | Quarter | Year | +----------+------+-------+---------+------+ | -31 | 31 | 1 | 0 | 0 | +----------+------+-------+---------+------+
Пример 4 – Неправилни типове аргументи
И двете функции връщат null, ако им бъде предаден грешен тип аргумент.
SET @time1 = '12:15:35', @time2 = '00:00:00'; SELECT DATEDIFF(@time1, @time2) AS 'DATEDIFF', TIMESTAMPDIFF(day, @time1, @time2) AS 'TIMESTAMPDIFF';
Резултат:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | NULL | NULL | +----------+---------------+
Пример 5 – Смесени типове аргументи
И двете функции ви позволяват да предоставите дата като един аргумент и дата и час като друг аргумент.
SET @thedate = '2010-10-11', @thedatetime = '2010-10-10 00:00:00'; SELECT DATEDIFF(@thedate, @thedatetime) AS 'DATEDIFF', TIMESTAMPDIFF(day, @thedate, @thedatetime) AS 'TIMESTAMPDIFF';
Резултат:
+----------+---------------+ | DATEDIFF | TIMESTAMPDIFF | +----------+---------------+ | 1 | -1 | +----------+---------------+