Operaciones con fechas

Aqui algunos ejemplos para adicionar y sustraer días y meses y encontrar la diferencia entre fechas en Oracle. Estos ejemplos toman el resultado de la tabla "dual. La tabla Dual es una tabla virtual que existe en todas las Bases de datos Oracle. Muchas veces hemos usado la consulta SELECT sysdate FROM dual; la cual simplemente nos retorna la fecha y hora actual.

Ajustar Dias, Semanas, Horas y minutos


Para adicionar y sustraer días a una fecha, simplemente usamos los signos + o - respectivamente. Algunos ejemplos:
SQL> SELECT sysdate + 7 FROM dual;
SYSDATE+
-------
25/09/06
SQL> SELECT sysdate - 30 FROM dual;
SYSDATE-
--------
19/08/06
SQL> SELECT to_char(sysdate - 14, 'MM/DD/YYYY HH:MI AM') FROM dual;
TO_CHAR(SYSDATE-14,
-------------------
09/04/2006 11:41 AM
En el primer ejemplo, vemos que la consulta retorna la fecha siete días apartir de hoy. La segunda retorna la fecha de hace 30 días. En la tercera, se ha usado la función de conversión to_char, para ver las horas y minutos. Esto nos muestra que mientras la fecha, ha cambiado, el tiempo no cambia.
Los ejemplos primero y tercero ademas muestran como el adicionar días, puede ser útil para computar semanas. Si ud desea simplificar el computo de semanas, podías usar querys de este tipo:
SQL> SELECT sysdate + (7 * 3) FROM dual;
SYSDATE+
--------
09/10/06
Así mismo, para trabajar con horas ud podría usar fracciones de día. La forma más simple para mostrar esto es dividiendo por 24, que es el numero de horas diarias. Aunque el parentesis no es necesario, permite evidenciar con más claridad la sentencia
Aqui, se muestra la hora actual y luego la hora actual mas dos horas:
SQL> SELECT to_char(sysdate, 'HH:MI AM') FROM dual;
TO_CHAR(
--------
02:00 PM
SQL> SELECT to_char(sysdate + (2/24), 'HH:MI AM') FROM dual;

TO_CHAR(
--------
04:00 PM

Una alternativa a este método es el uso de la función numtodsinterval. El anterioir ejemplo puede ser reescrito de la siguiente manera (la función numtodsinterval viene incorporada en la BD apartir de oracle 9i):
SQL> SELECT to_char(sysdate + numtodsinterval(2, 'HOUR'), 'HH:MI AM')
FROM dual;
TO_CHAR(
---
02:00 PM
Aquí la función numtodsinterval está haciendo el trabajo de dividir 2/24 horas. Las opciones válidas para esta función son: ‘DAY’, ‘HOUR’, ‘MINUTE’, o ‘SECOND’. Aquí un ejemplo usando ‘MINUTE’. Cuando se trabaja con minutos la función numtodsinterval es mucho más legible.
SQL> SELECT to_char(sysdate + numtodsinterval(45, 'MINUTE'), 'HH:MI AM')FROM dual;
TO_CHAR(
--------
03:19 PM

Ajustar meses y años


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’.
SQL> SELECT to_char(sysdate + numtoyminterval(5, 'MONTH'), 'MM/DD/YYYY') FROM dual;
TO_CHAR(SY
----------
02/18/2007
SQL> SELECT to_char(sysdate + numtoyminterval(2, 'YEAR'), 'MM/DD/YYYY') FROM dual;
TO_CHAR(SY
----------
09/18/2008

Comparar fechas

Suponga que deseamos comparar algunas fechas y encontrar el numero de días entre ellas. Para ver este resultado en días, simplemente basta con usar el operador -, de la siguiente manera:
SQL> SELECT TO_DATE('11/04/2006', 'MM/DD/YYYY') - sysdate FROM dual;
TO_DATE('11/04/2006','MM/DD/YYYY')-SYSDATE
------------------------------------------
46,3796528
El resultado es expresado en días, incluyendo horas fraccion de horas. Por supuesto si se desea semanas, se podría dividir el resultado entre 7. De manera similar, si se desea obtener horas, se debería multiplicar por 24, pero si se desea meses, entonces se podría usar la función months_between.
SQL> SELECT months_between(sysdate, to_date('01/01/2006', 'MM/DD/YYYY')) FROM dual;
MONTHS_BETWEEN(SYSDATE,TO_DATE('01/01/2006','MM/DD/YYYY'))
----------------------------------------------------------
8,56846625

Retornar la mayor y menor fecha dentro de un conjunto

Las funciones greatest y least pueden ser usadas en fechas para retornar la menor o la mayor fecha.
SQL> SELECT greatest(sysdate,sysdate+1, to_date('09/11/2005','MM/DD/YYYY'), to_date('12/25/2005','MM/DD/YYYY'))FROM dual;
GREATEST
--------
19/09/06
SQL> SELECT least(sysdate,sysdate+1,to_date('09/11/2005','MM/DD/YYYY'), to_date('12/25/2005','MM/DD/YYYY'))FROM dual;
LEAST(SY
--------
11/09/05


Cual es el último día de este mes?


La función last_day retorna el último día del mes pasado como parámetro.
SQL> select last_day(sysdate) from dual;
LAST_DAY
--------
30/09/06


Siguiente día de la semana despues de una fecha


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:
SQL> select next_day(sysdate,'Domingo') from dual;
NEXT_DAY
--------
24/09/06

Comentarios

EVil ha dicho que…
Hola.
Me parece muy buena la información de tu sitio, y quisiera saber si hay una forma de sumar y restar fechas y horas de forma manual sin usar las funciones numtodsinterval y numtoymininterval, esto es en el caso de que me encuentre con una base en 8i.

Gracias de antemano y felicidades por el sitio!.
Anónimo ha dicho que…
simplemente excelente, muchas gracias, fue de gran ayuda. muy claro directo, preciso y los ejemplos funcionan.
Unknown ha dicho que…
Todo lo comparan con sysdate pero como hago si yo quiero saber cuantos empleados nacieron en el año 1990 o en el mes de abril de cualquier año? RESPUESTA URG no consigo informacion sobre ello y las consultas que trato de hacer me dan error Gracias!
Anónimo ha dicho que…
Justo lo que buscaba. Muchas gracias
Anónimo ha dicho que…
Muy bueno!!!!!
Me ha sido muy util, muchas gracias
Anónimo ha dicho que…
hola
como extraer fechas con un inner join que une 2 tablas pero que una de ellas tenga las fechas laborables y la otra tabla la fecha que laboro un trabajador ... la respuesta tiene que salirme las fechas que no laboro en un determinado rango de fechas ...sldos y gracias de antemano
Marino ha dicho que…
Gracias por la info, me ha sido de gran utilidad
luichigo ha dicho que…
muy buena tu pagina! tienes buenos ejemplos y facil de comprender ;)
Anónimo ha dicho que…
Muy buen articulo, justo lo que necesitaba
Anónimo ha dicho que…
Después de bastante tiempo sigue siendo útil. Muchas gracias. Jc.
Anónimo ha dicho que…
Hola, la verdad esta genial la info posteada. Quisiera consultarte como hago para obtener solamente el año de una variable tipo date.
Ej: fecha DATE necesito sólo el año.
Desde ya muchas gracias.
Saludos
URUGUAY BD
Anónimo ha dicho que…
interesante, conoceras algun procedimiento para leer una fecha y mostrala , por ejemplo escribes '12-05-2001' que se muestre en este formato:'12 de mayo del 2010'.
Anónimo ha dicho que…
ME FUE DE MUCHA UTILIDAD GRACIAS POR TOMARTE EL TIEMPO DE POSTEAR ALGO ASI
Anónimo ha dicho que…
gracias, me ha servido para poder terminar un trabajo!!
Superfich ha dicho que…
No era lo que andaba buscando pero me va a servir para otros problemas que tengo que resolver al rato..

Te rifas!!!

Muchas Gracias!
Anónimo ha dicho que…
Muy Bueno graciassss
Anónimo ha dicho que…
justo lo que andaba buscando... muchisimas gracias!!!!!!!

Isabella
rsc ha dicho que…
¡Muy completo y muy buenos ejemplos! Por cierto, una curiosidad sobre las DATE en Oracle: Julian Day y el SGBD de Oracle
Anónimo ha dicho que…
Da gusto encontrar post asi, Muchas gracias por compartir!!!
Anónimo ha dicho que…
Hola, como puedo hacer para traer una fecha que sea menor o igual en Oracle... estoy intentando con <= pero no me trae los datos que son iguales, solo me trae los datos que son menores a la fecha que ingreso... de antemano Gracias
Unknown ha dicho que…
amigo una consulta tengo una tabla en oracle y quiero ponerle una restriccion para el campo fecha de nacimiento es decir que no permita el ingreso de fechas posteriores el sistema, como podria hacerlo ya q he probado de varias formas y no he tenido exito muchas gracias
Anónimo ha dicho que…
Hola! Muchas gracias! era lo que necesitaba!
Saludos,
Dora
Unknown ha dicho que…
hola me ha servido mucho la informacion muy buena gracias, ahora no habra forma de saber cual es el dia de un fecha, es decir la fecha X le corresponde a lunes o algo por el estilo si pudieras ayudarme te agradeceria mucho
Unknown ha dicho que…
hola me ha servido mucho la informacion muy buena gracias, ahora no habra forma de saber cual es el dia de un fecha, es decir la fecha X le corresponde a lunes o algo por el estilo si pudieras ayudarme te agradeceria mucho
Anónimo ha dicho que…
I like it, just what I wanted.
Unknown ha dicho que…
Hola quisiera saber como hacer para ingresar el mes y año y me imprima la cantidad de dias de este mes ingresado identificando si año bisiesto
Unknown ha dicho que…
como obtengo el ultimo dia de cierto mes , por ejemplo quiero traer el ultimo dia de octubre??
Anónimo ha dicho que…
numtoyminterval no funciona para fechas 29 de febrero, error ORA-01839
Unknown ha dicho que…
CON ESTO SACAS EL ULTIMO DIA DEL MES.
SQL> SELECT last_day(SYSDATE)-SYSDATE+(select to_char(sysdate,'DD') FROM DUAL) AS T2 FROM DUAL;

T2
---------
31

MEJIA.JOSED15@GMAIL.COM ESPERO LES SIRVA
Unknown ha dicho que…
Como saco el último día hábil de un mes?

Entradas populares de este blog

Actualizar las estadísticas

Subconsultas