Dada la vagancia que me suele acompañar en todo, cuanto menos, mejor y cuanto menos escriba... bueno... a veces salen cosas buenas.
Revolviendo por ahí me encontré con esta maravillosa funcIón de Oracle llamada NUMTOYMINTERVAL.
Sintaxis:
NUMTOYMINTERVAL ( n , 'char_expr' );Más o menos lo que debia hacer era algo así como calcular la fecha del último día del mes, pero con una frecuencia que variaba entre años, dias, meses, etc.
En definitiva, eso de sumarle a la fecha los días está bueno, pero me parecía que ya existía una función que hacía eso.
Comenzando a revolver...
Luego de googler mucho, me econtré con esa belleza y me puse a trabajar.
Claro con esto e smas sencillo, porque la función convierte un número n, a un intervalo de mes o año, dependiendo del literal varchar que se le paso como segundo parametro.
Este segundo parametro puede ser
YEAR (año)
MONTH (mes)
Fijense que lo puse en muyúsculas. OJO!!! es CASE SENSITIVE!!!!
Un ejemplo burdo pero útil.
"A la fecha del día sumerle 6 meses"
Claro... una pavada...
perooooo... con esto es mas sencillo:
BR>SELECT SYSDATE
2 FROM DUAL;
SYSDATE
---------
16-DEC-10
BR>SELECT (SYSDATE + NUMTOYMINTERVAL(6,'MONTH')) SYSDATEMAS6
2 FROM DUAL;
SYSDATEMAS6
---------
16-JUN-11
Nada de andar coontando dias, sumando ni dividiendo... directo y al grano.
si le queremos sumar 2 años la usamos de la siguiente manera:
BR>select sysdate + NUMTOYMINTERVAL(2, 'YEAR') FECHAMAS2
2 FROM DUAL;
FECHAMAS2
---------
16-DEC-12
Claro, mi funcion fué así de sencilla:
CREATE OR REPLACE FUNCTION COL_DATE_POST_REVFREQ(vFecha IN DATE, vRevFrec IN VARCHAR2) RETURN DATE IS
vRevFrec2 CHAR;
vFechaRet DATE;
BEGIN
/*Autor: Mariano Dominguez.
fecha: 13/12/2010
proposito: devuelve la fecha segun la frecuencia */
vRevFrec2 := UPPER(vRevFrec);
CASE vRevFrec
WHEN 'D' THEN
vFechaRet := trunc(vFecha + 1);
WHEN 'W' THEN
vFechaRet := trunc(vFecha + 7);
WHEN 'M' THEN
vFechaRet:= trunc(LAST_DAY((vFecha + NUMTOYMINTERVAL(1,'MONTH'))));
WHEN 'Q' THEN
vFechaRet:= trunc(LAST_DAY((vFecha + NUMTOYMINTERVAL(3,'MONTH'))));
WHEN 'A' THEN
vFechaRet:= trunc(LAST_DAY((vFecha + NUMTOYMINTERVAL(1,'YEAR'))));
WHEN 'S' THEN
vFechaRet:= trunc(LAST_DAY((vFecha + NUMTOYMINTERVAL(6,'MONTH'))));
END CASE;
RETURN vFechaRet;
EXCEPTION
WHEN OTHERS THEN
--ERROR
DBMS_OUTPUT.PUT_LINE('ERROR>>'||SQLERRM);
END;
/
Muy sencillo y práctico.
No select explicito y si al uso de asiganaciones.
Si al uso de "case" y no al miedo a las funciones.
Saludos y luego subo a su hermanita... numtodsinterval.
Este comentario ha sido eliminado por el autor.
ResponderEliminarMuy bueno y sin realizar ningun tipo de calculo
ResponderEliminar...mas todavia.
Este comentario ha sido eliminado por el autor.
ResponderEliminar