Как получить количество дней разницы между двумя датами на 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.