viernes, 23 de octubre de 2015

Operaciones y funciones con fechas y sysdate

Cuando se trabaja con fechas en Oracle  se debe tener en cuenta que la aritmética de fechas en Oracle se trabaja en función de un día. La pseudo-columna SYSDATE muestra la fecha y hora actual de sistema, podemos  aumentar la fecha y hora actual en un día. Se pueden usar fracciones para añadir horas, minutos o segundos a la fecha. Ahora si bien podemos usar el comando to_date para formatear fechas podemos en base a SYSDATE hacer cálculos a futuro bajo los siguientes ejemplos:

SELECT sysdate - 10 FROM dual;

SYSDATE
--------
13/10/2015 05:32:19 p.m

SELECT sysdate + 4 FROM dual;
 
SYSDATE
--------
27/10/2015 05:32:19 p.m

SELECT sysdate + (5 * 2) FROM dual;

SYSDATE
--------
02/11/2015 05:35:01 p.m.

SELECT to_char(sysdate, 'HH:MI AM') FROM dual;

SYSDATE
--------
05:35 PM

SELECT to_char(sysdate + (2/24), 'HH:MI AM') FROM dual;

SYSDATE
--------

07:35 PM

En base al ultimo ejemplo podemos usar una alternativa usando la función numtodsinterval. Con la función numtodsinterval realiza la división de dividir sobre 24 horas. Las opciones válidas para esta función son: ‘DAY’, ‘HOUR’, ‘MINUTE’, o ‘SECOND’. Aquí algunos ejemplos:

SELECT to_char(sysdate + numtodsinterval(2, 'HOUR'), 'HH:MI AM')
FROM dual;

SYSDATE
--------
07:57 PM

SELECT to_char(sysdate + numtodsinterval(45, 'MINUTE'), 'HH:MI AM')FROM dual;

SYSDATE
--------
06:43 PM

Para trabajar con meses y años (cada uno de los cuales puede variar en número de días) Oracle ofrece la función numtoyminterval. Esta trabaja en forma similar a la función numtodsinterval mencionada antes tomando un numero y una cadena string. Las opciones válidas para esta función son: ‘YEAR’ or ‘MONTH’. . Aquí algunos ejemplos:

SELECT to_char(sysdate + numtoyminterval(5, 'MONTH'), 'DD/MM/YYYY') FROM dual;

SYSDATE
--------
23/03/2016

SELECT to_char(sysdate + numtoyminterval(2, 'YEAR'), 'DD/MM/YYYY') FROM dual;

SYSDATE
--------
23/10/2017

Si deseamos comparar algunas fechas y encontrar el numero de días entre ellas. Para ver este resultado en días debemos usar la función months_between. de la siguiente manera:

SELECT months_between(TRUNC(sysdate), to_date('21/05/2014', 'DD/MM/YYYY')) FROM dual

MONTHS_BETWEEN(TRUNC(SYSDATE),
------------------------------
17.0645161290323


Las funciones greatest y least pueden ser usadas en fechas para retornar la menor o la mayor fecha.


SELECT greatest(sysdate,sysdate+1, to_date('09/11/2013','MM/DD/YYYY'), to_date('12/25/2010','MM/DD/YYYY'))FROM dual;

GREATEST
--------
24/10/2015 06:10:56 p.m.

SELECT least(sysdate,sysdate+1,to_date('09/11/2013','MM/DD/YYYY'), to_date('12/25/2010','MM/DD/YYYY'))FROM dual;

LEAST(SY
--------

25/12/2010


Podemos usar la función last_day para retornar el último día del mes pasado como parámetro.


select last_day(sysdate) from dual;


LAST_DAY
--------
31/10/2015 06:13:48 p.m.


La función next_day retorna la fecha de la próxima ocurrencia de un día de la semana(’Monday’, ‘Tuesday’, etc.) después de una fecha dada. ejemplo: consultar la fecha del próximo domingo:


select next_day(sysdate,'Domingo') from dual;


NEXT_DAY
--------
25/10/2015 06:14:30 p.m.

Query para obtener exclusiones de menu por responsabilidad

El siguiente query nos brinda información de que menús o funciones se han agregado por responsabilidad en la opción de exclusiones de Menú, esto nos puede servir para tener un control o un listado de que opciones se han quitado a cierta responsabilidad de acuerdo al perfil del usuario.


select res.responsibility_name responsabilidad,
      app.application_name aplicacion,
      res.responsibility_key clave_responsabilidad,
      decode(exc.rule_type,'F','Function','M', 'Menu', rule_type)tipo_exclusion,
      decode(exc.rule_type,'F',(select function_name || ',' || fnc.USER_FUNCTION_NAME
                                   from fnd_form_functions_vl fnc
                                  where fnc.function_id = exc.action_id
                                )
                           ,'M',(select menu_name || ',' || imn.USER_MENU_NAME
                                   from fnd_menus_vl imn
                                   where imn.menu_id = exc.action_id
                                )
                           , to_char(exc.action_id)
             ) menu_funcion_excluida
  from apps.fnd_responsibility_vl res
     , apps.fnd_application_vl    app
     , apps.fnd_data_groups       dat
     , apps.fnd_menus_vl          mnu
     , apps.fnd_request_groups    req
     , apps.fnd_application_vl    apd
     , apps.fnd_application_vl    apr
     , apps.fnd_resp_functions    exc
 where res.application_id            = app.application_id
   and res.data_group_id             = dat.data_group_id
   and res.data_group_application_id = apd.application_id
   and res.menu_id                   = mnu.menu_id
   and req.request_group_id          = res.request_group_id
   and req.application_id            = res.group_application_id
   and apr.application_id            = req.application_id
   and exc.application_id            = res.application_id
   and exc.responsibility_id         = res.responsibility_id

   and res.responsibility_name ='&responsabilidad'

Administrador de Tipos de Cambios de Divisa

El Administrador de Tipos de Cambios de Divisa (Currency Rates Manager) permite gestionar toda la información de sus tipo de cambio en un solo lugar. Esta nueva herramienta permite que puede manejar fácilmente sus tipos de cambio diario e históricos dentro de una nueva interfaz. Los beneficios de usar esta opción es poder dar un mantenimiento a múltiples divisas y diferentes tipos de conversiones.

Dentro de esta opción se puede :
  • Ingresar Tipos de Cambio Diarios
  • Cargar  Tipos de Cambio Diarios o históricos desde una hoja de cálculo para Oracle General Ledger.
  • Descarga tipos de cambio históricos para una hoja de cálculo. Puede descargar de forma única para  revisión o actualización. Si actualiza, modifica los índices históricos en la hoja de cálculo para luego subirlo a Oracle General Ledger.
  • Mediante la interfaz web puede revisar los tipos de cambio de Periodo
  • Puede crear Tipos de cambio cruzado. Estos se calculan basados en las relaciones de tipos de divisa definidos. General Ledger calculará los tipos de cambio cruzados en base a una regla de validación.


Para ingresar a esta interfaz debe ir a una responsabilidad de General Ledger >> Configuración >> Divisas >> Administrador de Tipos de Cambios de Divisa. Seleccione una de las siguientes opciones : Tipos de Cambio Diarios, Tipos de Cambio de Periodo, Tipos de Cambio Históricos o Clases de Tipo de Cambio.