Saltar al contenido

La diferencia en meses entre fechas en MySQL

Si encuentras algún fallo en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes añadir el código al trabajo final.

Solución:

Mes de diferencia entre dos fechas dadas:

Me sorprende que esto no haya sido mencionado todavía:

Echa un vistazo a la TIMESTAMPDIFF() función en MySQL.

Lo que esto te permite hacer es pasar en 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.

Puedes 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 tiene que preocuparse por nada de eso.


Mes-diferencia 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
  )

Dónde 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

PERIOD_DIFF calcula meses entre dos fechas.

Por ejemplo, para calcular la diferencia entre now() y una columna de tiempo en your_table:

select period_diff(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months from your_table;

También uso PERIODDIFF. Para obtener el año y el mes de la fecha, uso la función EXTRACTO:

  SELECT PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months FROM your_table;

Valoraciones y reseñas

Al final de la post puedes encontrar las referencias de otros desarrolladores, tú además eres capaz dejar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *