Diferencia de mes entre dos fechas dadas:
Me sorprende que esto no se haya mencionado todavía:
Eche un vistazo a TIMESTAMPDIFF() función en MySQL.
Lo que esto le permite hacer es pasar dos TIMESTAMP
o DATETIME
valores (o incluso DATE
ya que MySQL se convertirá automáticamente), así como la unidad de tiempo en la que desea basar su diferencia.
Puede especificar MONTH
como la unidad en el primer parámetro:
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
-- Outputs: 0
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
-- Outputs: 1
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
-- Outputs: 7
Básicamente obtiene el número de meses transcurridos desde la primera fecha en la lista de parámetros. Esta solución compensa automáticamente la cantidad variable de días de cada mes (28, 30, 31) y también tiene en cuenta los años bisiestos; no tienes que preocuparte por nada de eso.
Diferencia de mes con precisión:
Es un poco más complicado si desea introducir precisión decimal en la cantidad de meses transcurridos, pero así es como puede hacerlo:
SELECT
TIMESTAMPDIFF(MONTH, startdate, enddate) +
DATEDIFF(
enddate,
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate)
MONTH
) /
DATEDIFF(
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate) + 1
MONTH,
startdate + INTERVAL
TIMESTAMPDIFF(MONTH, startdate, enddate)
MONTH
)
Donde startdate
y enddate
son sus parámetros de fecha, ya sea de dos columnas de fecha en una tabla o como parámetros de entrada de un script:
Ejemplos:
With startdate = '2012-05-05' AND enddate = '2012-05-27':
-- Outputs: 0.7097
With startdate = '2012-05-05' AND enddate = '2012-06-13':
-- Outputs: 1.2667
With startdate = '2012-02-27' AND enddate = '2012-06-02':
-- Outputs: 3.1935