2011-12-21 3 views
2

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

У меня есть две даты, как:

  • 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. Fix: действительно У меня есть 0 месяц и 30 дней. Подробнее: за 1 месяц мне нужен 2013-05-01, потому что 2013-04-31 не существует.

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

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

+1

После того как вы получите количество '' months' с PERIOD_DIFF' вы можете добавить его в меньшую дату и после этого вычитания чтобы получить количество дней :-) – zerkms

+0

Я пропустил что-то или '2013-03-31' и' 2013-04-30' i ровно 1 месяц, так как период между последним днем ​​месяца и последним днем ​​следующего месяца месяц? – piotrekkr

+0

Мне нравится решение @ zerkms лучше, чем любой из ответов :-) – BRFennPocock

ответ

2

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

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

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

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

+0

Я принял это, потому что это помогает обнаружить мой ответ. Я буду редактировать его в будущем. ;) Спасибо всем, будьте очень полезны. –

3

попробовать что-то вроде этого:

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; 

// EDIT фиксированной версии

Смежные вопросы