mysql中是否有任何方法可以返回两个日期之间的差异,以月和日为单位

时间:2018-01-29 10:24:02

标签: mysql mysql-workbench

mysql数据库中是否有任何方法可以在几个月和几天内返回两个日期之间的差异。例如,如果我提供01-01-2018作为fromdate和02-02-2018作为todate我想得到结果为1个月1天。

1 个答案:

答案 0 :(得分:0)

SELECT FLOOR(DATEDIFF('2018-02-01', '2018-01-01')/30) AS months, DATEDIFF('2018-02-01', '2018-01-01')%30 AS days;

唯一的问题是将月数计算为30天。因此,它没有考虑当月的天数。

<强>更新

将月份长度考虑在内的解决方案

SELECT 
(CASE WHEN (DAY('2018-02-02') >= DAY('2018-01-01')) 
THEN
    (YEAR('2018-02-02')*12 + MONTH('2018-02-02')) - (YEAR('2018-01-01')*12 + MONTH('2018-01-01'))
ELSE
    (YEAR('2018-02-02')*12 + MONTH('2018-02-02')) - (YEAR('2018-01-01')*12 + MONTH('2018-01-01')) - 1
END) AS months,
(CASE WHEN (DAY('2018-02-02') >= DAY('2018-01-01')) 
THEN
    DAY('2018-02-02') - DAY('2018-01-01')
ELSE
    (DAY(LAST_DAY('2018-01-01')) - DAY('2018-01-01')) + DAY('2018-02-02')
END) AS days;

您应该将日期作为变量插入(将&#39; 2018-01-01&#39;替换为fromdate和&#39; 2018-02-02&#39;替换为{{ 1}})。

<强>解释

月数和日数分别为2例:

  • 案例1 todate月份的某天高于(或等于)todate 月份的日期。在这种情况下,月数是年数* 12 + fromdate的月数,减去todate的相同计算。天数只是fromdate的天数减去todate的天数。
  • 案例2 fromdate月份的某一天低于todate 月份的日期。在这种情况下,月数是年数* 12 + fromdate的月数,减去todate的相同计算,减去1(因为月份不是&#39;&# 39;全&#39)。天数是fromdate月的最后一天,减去fromdate的日期加上fromdate的月份日期。或者换句话说:从该月的todate月开始的天数,再加上fromdate月份过去的天数。