2012-02-16 26 views

Respuesta

40

Intente agregar meses (12 * número de años) en su lugar. Así-

add_months(date'2010-10-10', 48) 
16

Use add_months

Ejemplo:

SELECT add_months(to_date('10-OCT-2010'), 48) FROM DUAL; 

Advertencia
ADD_MONTHS, devuelve el último día del mes que resulta si introduce el último día de un mes a empezar con.

Por lo tanto, add_months(to_date('28-feb-2011'),12) devolverá 29-feb-2012 como resultado.

6

No estoy seguro, si he entendido bien su pregunta, pero

select add_months(someDate, numberOfYears * 12) from dual 

podría hacer el truco

+0

Funciona para años bisiestos, también. – ScrappyDev

3

Puede probar esto:

someDate + interval '4' year

INTERVAL

+0

Solo una recomendación. Evite usar el tipo de datos INTERVAL. Cumple con ANSI/ISO. Por lo tanto, la declaración que escribió no funcionará el 29 de febrero. En general, depende de usted conceder que el resultado será correcto. Mientras add_months es propiedad de Oracle y genera fechas válidas para los casos. – ibre5041

+0

@ ibre5041 Perdón por haber levantado esta publicación de la tumba, pero estaba buscando una forma de hacerlo sin tener que mantener el último día del mes al calcular los cumpleaños porque add_month() falla para 2/28. Cuando el próximo año es bisiesto add_months (to_date ('02 -28 ',' MM-DD ')) devuelve 02-29, que no es correcto.Encontré que hacer lo siguiente siempre devuelve la fecha correcta: (to_date ('02 -28 ',' MM-DD ') - 1) + intervalo' 1 'año + 1 devuelve 02-28, incluso si el próximo año es un salto año, y si pone en 02-29, devolverá 03-01 en años no bisiestos. – Bob

2

Una opción más, aparte de ADD_MONTHS

SELECT 
     SYSDATE, 
     SYSDATE 
     + TO_YMINTERVAL ('1-0') 
FROM 
     DUAL; 


SYSDATE SYSDATE+TO_YMINTERVAL('1-0') 
--------- ---------------------------- 
29-OCT-13 29-OCT-14     
1 row selected. 


SELECT 
     SYSDATE, 
     SYSDATE 
     + TO_YMINTERVAL ('2-0') 
FROM 
     DUAL; 


SYSDATE SYSDATE+TO_YMINTERVAL('2-0') 
--------- ---------------------------- 
29-OCT-13 29-OCT-15     
1 row selected. 

SELECT 
     TO_DATE ('29-FEB-2004', 
       'DD-MON-YYYY') 
     + TO_YMINTERVAL ('1-0') 
FROM 
     DUAL 

    * 
Error at line 4 

ORA-01839: date not valid for month specified 

Pero la última es ilegal ya que no hay 29 días de de febrero de en 2005, por lo tanto falla en casos de año bisiesto (Feb 29)

Lea el documentation para el mismo

Cuestiones relacionadas