sql >> Base de Datos >  >> RDS >> Mysql

La diferencia en meses entre fechas en MySQL

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