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.