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

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

Две функции за дата, включени в 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 |
+----------+----------+

  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 заявка за динамично преобразуване на редове в колони на базата на две колони

  2. SELECT COUNT(*) AS count – Как да използвате този брой

  3. Изпълняване на mySQL заявка като cron работа?

  4. Как да мигрираме от MSSQL към MySQL

  5. Как да добавя общ ред в MySQL