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

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

Тази статия разглежда разликата между две 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 |
+----------+---------------+

  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 Създаване на таблици с външни ключове, даващи errno:150

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

  3. Какво представлява MySQL заявката, еквивалентна на PHP strip_tags?

  4. Как да напишете израз IF ELSE в MySQL заявка

  5. Как работи функцията CHARACTER_LENGTH() в MySQL