仅两个完整日期之间的月份距离

时间:2011-12-21 19:17:44

标签: mysql sql date

好吧,我需要得到两个代表两个完整日期之间距离的值(仅限小时/时间)......在MySQL上,我们有PERIOD_DIFF得到两个日期之间的差异(只有月份和年份) ),但我也需要包括这一天。

我有两个日期:

  • 2011-12-052012-01-10。在2012-01-05之后,我有1个月,更长的5天。
  • 2012-01-012012-03-01。我有2个月零0天。
  • 2012-02-292012-03-28¹。我有0个月和28天。 更多:1个月后,我需要2012-03-29
  • 2013-01-292013-02-28²。我有0个月零30天。 更多:1个月后,我需要2013-03-01,因为2013-02-29不存在。
  • 2013-03-312013-04-30修复真的我有0个月零30天。 更多:1个月后,我需要2013-05-01,因为2013-04-31不存在。

¹2012是闰年/ bissexto;
²2013不是;

我不知道我需要做什么来解决这个问题。

2 个答案:

答案 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;

// 编辑修正版

答案 1 :(得分:2)

总差异的变量设置为0。

使用DATEDIFF在开始日期和结束日期之间获得天数差异

每个月 您的开始和结束月份(如果之间有任何月份),请使用LAST_DAYDATEDIFF来计算该月的天数

天数总差异中减去该月的天数,并将添加1 减去总差异个月