Месячное расстояние только между двумя полными датами - PullRequest
2 голосов
/ 21 декабря 2011

Ну, мне нужно получить два значения, которые представляют расстояние между двумя полными датами (без часов / времени) ... В MySQL у нас есть PERIOD_DIFF, который получает разницу между двумя датами (только месяц и год),но мне нужно включить день тоже.

У меня есть две даты вроде:

  • 2011-12-05 и 2012-01-10.После 2012-01-05 у меня есть 1 полный месяц, больше 5 дней.
  • 2012-01-01 и 2012-03-01.У меня 2 месяца и 0 дней.
  • 2012-02-29 и 2012-03-28 ¹.У меня 0 месяц и 28 дней. Подробнее : на 1 месяц мне нужно 2012-03-29.
  • 2013-01-29 и 2013-02-28 ².У меня 0 месяц и 30 дней. Подробнее : на 1 месяц мне нужно 2013-03-01, потому что 2013-02-29 не существует.
  • 2013-03-31 и 2013-04-30. Исправлено : действительно У меня есть 0 месяц и 30 дней. Подробнее : на 1 месяц мне нужно 2013-05-01, потому что 2013-04-31 не существует.

¹ 2012 - високосный год / bissexto;² 2013 нет;

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

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

попробуйте что-то вроде этого:

SET @start = '2013-03-31';
SET @end = '2013-04-30';
-- date @start is last day of month ?
SET @start_last = @start = LAST_DAY(@start);
-- date @end is last day of month ?
SET @end_last = @end = LAST_DAY(@end);

-- checking if difference is more than month
SET @month_or_more =IF(@start_last AND @end_last OR DAY(@start) = DAY(@end), DATE_ADD(@start, INTERVAL 1 MONTH) <= @end, DATE_ADD(@start, INTERVAL 1 MONTH) < @end);
-- diff in months
SET @m_num = IF(@month_or_more, PERIOD_DIFF( DATE_FORMAT(@end, '%Y%m'), DATE_FORMAT(@start, '%Y%m')), 0);
-- diff in days
SET @d_num = DATEDIFF(DATE_ADD(@start, INTERVAL @m_num MONTH), @end);

SELECT ABS(@m_num) as month,  ABS(@d_num) as days;

// РЕДАКТИРОВАТЬ фиксированная версия

2 голосов
/ 21 декабря 2011

Установить некоторую переменную для общая разница в месяцах до 0.

Используйте DATEDIFF, чтобы получить общую разницу в днях между датой начала и окончания.

Для каждого месяца между вашим началом и концом месяца (, если есть какие-либо месяцы между ), используйте LAST_DAY и DATEDIFF для вычисления числа дней в этом месяце .

Вычтите количество дней в этом месяце из общей разницы в днях и добавьте 1 к общей разнице в месяцах .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...