Как получить количество дней разницы между двумя датами на MySQL?

162

Мне нужно получить количество дней, содержащихся в паре дат на MySQL.

Например:

  • Дата заезда 12-04-2010
  • Проверить дату 15-04-2010

Разница в днях будет 3

Audel
источник

Ответы:

262

Что насчет функции DATEDIFF ?

Цитирую страницу руководства:

DATEDIFF () возвращает expr1 - expr2, выраженное в виде значений в днях от одной даты до другой. expr1 и expr2 являются выражениями даты или даты и времени. В расчете используются только части даты значений


В вашем случае вы бы использовали:

mysql> select datediff('2010-04-15', '2010-04-12');
+--------------------------------------+
| datediff('2010-04-15', '2010-04-12') |
+--------------------------------------+
|                                    3 | 
+--------------------------------------+
1 row in set (0,00 sec)

Но обратите внимание, даты должны быть записаны как YYYY-MM-DD, а не DD-MM-YYYYкак вы опубликовали.

Паскаль МАРТИН
источник
да, я забыл о формате даты, когда я задал вопрос; p спасибо
Audel
4
PS YYYY-MM-DD соответствует стандарту ISO 8601, поэтому каждый должен его использовать. Очень практично
Эрнестас Станкявичюс
4
Примечание . Первый аргумент должен быть больше, чем второй аргумент datediff()метода, иначе он вернет отрицательное значение.
Шашант
38

Обратите внимание, что если вы хотите посчитать полные 24 часа между двумя датами, datediff может вернуть вам неправильные значения.

В документации говорится:

В расчете используются только части даты значений.

что приводит к

select datediff('2016-04-14 11:59:00', '2016-04-13 12:00:00')

возвращает 1 вместо ожидаемого 0.

Решение использует select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00'); (обратите внимание на противоположный порядок аргументов по сравнению с датированным).

Некоторые примеры:

  • select timestampdiff(DAY, '2016-04-13 11:00:01', '2016-04-14 11:00:00'); возвращает 0
  • select timestampdiff(DAY, '2016-04-13 11:00:00', '2016-04-14 11:00:00'); возвращает 1
  • select timestampdiff(DAY, '2016-04-13 11:00:00', now()); возвращает количество полных 24-х дней, прошедших с 2016-04-13 до 11:00:00 .

Надеюсь, это кому-нибудь поможет, потому что поначалу не очень понятно, почему datediff возвращает значения, которые кажутся неожиданными или неправильными.

Конрад Галежовский
источник
странно, что аргументы переворачиваются между datediff()и timestampdiff().
Биллиноа
17

Используйте DATEDIFF()функцию.

Пример из документации:

SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
    -> 1
Тобиас Коэн
источник
6

Я предпочитаю TIMESTAMPDIFF, потому что вы можете легко изменить блок, если это будет необходимо.

theblang
источник
5

Получить дни между текущей датой и датой назначения

 SELECT DATEDIFF('2019-04-12', CURDATE()) AS days;

вывод

дней

 335
vijayabalan
источник
2
SELECT md.*, DATEDIFF(md.end_date, md.start_date) AS days FROM  membership_dates md

вывод::

id  entity_id    start_date            end_date             days

1   1236      2018-01-16 00:00:00     2018-08-31 00:00:00    227
2   2876      2015-06-26 00:00:00     2019-06-30 00:00:00   1465
3   3880      1990-06-05 00:00:00     2018-07-04 00:00:00   10256
4   3882      1993-07-05 00:00:00     2018-07-04 00:00:00   9130

надеюсь, это поможет кому-то в будущем

разработчик
источник