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.