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


162

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

Например:

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

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

Ответы:


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().
— Биллиноа



5

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

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

вывод

дней

 335

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.