2011-04-12 20 views
6

Tengo dos columnas en una tabla de MySQL:Cómo calcular la diferencia entre dos fechas en meses en MySQL

  • DateOfService (fecha y hora)
  • Fecha de nacimiento (fecha)

Quiero correr una consulta MySQL que proporcionará la diferencia de fecha entre estos dos campos en meses.

¿Cómo puedo hacer esto en una consulta de selección de MySQL?

Gracias.

+0

¿Puede darnos un ejemplo de la producción que espera? Por ejemplo, hoy es el 12 de abril y mi cumpleaños es el 14 de abril o el 12 de mayo o el 15 de mayo. ¿Qué valores esperarías recibir de la consulta? – Teetrinker

+0

Duplicado: http://stackoverflow.com/questions/288984/the-difference-in-months-between-dates-in-mysql – manji

+0

La fecha de la columna DateOfService siempre será mayor que la columna BirthDate. Entonces, debo restar BirthDate de DateOfService y calcular la diferencia en meses. – Awan

Respuesta

8

Esto podría funcionar:

SELECT 12 * (YEAR(DateOfService) 
       - YEAR(BirthDate)) 
     + (MONTH(DateOfService) 
      - MONTH(BirthDate)) AS months 
FROM table 
+0

he usado esta consulta ... el tema surge en una fecha particular. las fechas son 2014-01-30 a 2014-03-02 difieren 30 días solamente. pero es la diferencia de devoluciones de 2 meses. – Vaishu

+0

@jey: técnicamente están dos meses lejos el uno del otro ... – Marco

3

Prueba esto:

SELECT DATEDIFF(DateOfService, BirthDate)/30 as months FROM ...

40

Tenga una mirada en la función TIMESTAMPDIFF() en MySQL.

Lo que esto le permite hacer es pasar en dos o TIMESTAMPDATETIME valores (o incluso DATE como MySQL se auto-convertir), así como la unidad de tiempo que desea basar su diferencia en.

Puede especificar MONTH como la unidad en el primer parámetro:

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04') 
-- 0 

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05') 
-- 1 

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15') 
-- 1 

SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16') 
-- 7 

Básicamente obtiene el número de meses transcurridos desde la primera fecha en la lista de parámetros. Esta solución representa la cantidad variable de días en cada mes (28,30,31), así como los años bisiestos.


Si desea precisión decimal en el número de meses transcurridos, que es un poco más complicado, pero aquí es cómo 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 guión:

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 
+0

Oye, soy capaz de lograr el resultado anterior pero mi condición es que necesito 0.5 año, 1 año, 1.5 año, 2 año, 2.5 año y así sucesivamente .. ¿Cómo podría hacer eso? – Dipen

2

TRY con

PERIOD_DIFF (P1, P2)

Devuelve el número de meses entre los periodos P1 y P2. P1 y P2 deben estar en el formato YYMM o YYYYMM. Tenga en cuenta que los argumentos de período P1 y P2 no son valores de fecha.

mysql> SELECCIONAR PERIOD_DIFF (200802,200703); -> 11

+0

esto no responde a la pregunta de OP ya que no acepta el formato de fecha y hora ni el formato de fecha. Tal vez si esta pregunta fue editada mostrando esto, entonces podría retractar mi -1. – amaster

0
TIMESTAMPDIFF(MONTH, Start_date, End_date) 

Ejemplo:

SELECT TIMESTAMPDIFF(MONTH, BirthDate, DateOfService) AS Months FROM Table 
-1

Sobre la base de un resumen de todas las respuestas y una búsqueda en Google, creo que hay cuatro formas casi similares a escribirlo:

1)

TIMESTAMPDIFF(MONTH, Start_date, End_date) AS Period 

Por ej.

TIMESTAMPDIFF(MONTH, MIN(r.rental_date), MAX(r.rental_date)) AS Period 

2)

PERIOD_DIFF(date_format(now(), '%Y%m'), date_format(time, '%Y%m')) as months 

O

PERIOD_DIFF(date_format(End_date(), '%Y%m'), date_format(Start_date, '%Y%m')) as months 

P. ej

PERIOD_DIFF(date_format(MAX(r.rental_date), '%Y%m'), date_format(MIN(r.rental_date), '%Y%m')) as months 

3)

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM NOW()), EXTRACT(YEAR_MONTH FROM time)) AS months 

O

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM End_date()), EXTRACT(YEAR_MONTH FROM Start_date)) AS months 

P. ej

PERIOD_DIFF(EXTRACT(YEAR_MONTH FROM MAX(r.rental_date)), EXTRACT(YEAR_MONTH FROM MIN(r.rental_date))) as Months 

4)

PERIOD_DIFF(concat(year(d1),if(month(d1)<10,'0',''),month(d1)), concat(year(d2),if(month(d2)<10,'0',''),month(d2))) as Months** 

P. ej

PERIOD_DIFF(
      concat(year(MAX(r.rental_date)),if(month(MAX(r.rental_date))<10,'0',''),month(MAX(r.rental_date))), 
      concat(year(MIN(r.rental_date)),if(month(MIN(r.rental_date))<10,'0',''),month(MIN(r.rental_date))) 
      ) as Months 
0

La respuesta "correcta" depende de lo que necesita exactamente. Me gusta redondear al número entero más cercano.

Considere estos ejemplos: 1 de enero -> 31 de enero: Son 0 meses completos, y casi 1 mes de duración. 1 de enero -> 1 de febrero? Es 1 mes completo y exactamente 1 mes de duración.

Para obtener el número de enteros meses, el uso:

SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-01-31'); => 0 
SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-02-01'); => 1 

Para obtener una redondeado duración en meses, que puede usar:

SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1 
SELECT ROUND(TIMESTAMPDIFF(DAY, '2018-01-01', '2018-01-31')*12/365.24); => 1 

Esto tiene una precisión de +/- 5 días y para rangos de más de 1000 años. La respuesta de Zane es obviamente más precisa, pero es demasiado detallada para mi gusto.

Cuestiones relacionadas