Si aprendes como se deben Restar dos Fechas en los PL-SQL Procedures en Oracle podrás obtener la cantidad de días, horas, minutos y segundos que han transcurrido entre la primera fecha y la segunda fecha.
Para restar dos fechas primero se debe procurar que siempre la primera fecha sea mayor que la segunda fecha, de lo contrario, el resultado entregado no será el esperado.
En los PL-SQL Procedures en Oracle es muy fácil realizar operaciones con fechas, ya que solo aplicando algunas operaciones matemáticas básicas se pueden obtener los resultados deseados rápidamente.
Revisemos algunos ejemplos prácticos para que entiendas con mayor claridad como se deben restar fechas en los PL-SQL Procedures en Oracle.
Ejemplo #1: Supone que deseas obtener la cantidad de días trabajados durante el mes por un empleado, veamos como se hace:
/* PL-SQL Procedures en Oracle */
Ldt_primer_dia date:= to_date(’01-03-2012’,’dd-mm-yyyy’);
Ldt_dia_actual date:= to_date(’22-03-2012’,’dd-mm-yyyy’);
Lin_dias_trabajados number(3);
Begin
Lin_dias_trabajados := (ldt_dia_actual – ldt_primer_dia);
End;
En este ejemplo se restan dos fechas, donde primero se coloca la fecha mayor (ldt_dia_actual) menos la fecha menor (ldt_primer_dia). El resultado de esta operación es 21 días, este resultado puede ser correcto dependiendo del contexto del PL-SQL Procedures en Oracle donde se aplique, para este caso asumiré que es un valor erróneo ya que necesito obtener 22 días como resultado, para corregir el problema se debe realizar lo siguiente:
/* PL-SQL Procedures en Oracle */
Lin_dias_trabajados := (ldt_dia_actual – ldt_primer_dia) + 1;
A la operación se agrego que se sume 1 día para poder obtener como resultado los 22 días.
TÚ REPORTE: “Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos”
Ejemplo #2: Supone ahora que deseas obtener las horas, minutos y segundos que ha trabajado el empleado, veamos como se hace:
/* PL-SQL Procedures en Oracle */
Select
((sysdate – mtra.primer_dia) + 1) dias,
((sysdate – mtra.primer_dia) + 1) * 24 horas,
((sysdate – mtra.primer_dia) + 1) * 24 * 60 minutos,
((sysdate – mtra.primer_dia) + 1) * 24 * 60 * 60 segundos
From t_mes_trabajado mtra
Where mtra.id_empleado = pin_id_empleado;
En este ejemplo las operaciones se realizan dentro de una consulta SELECT donde se utiliza la variable de sistema SYSDATE para obtener la fecha actual, luego se realizan las operaciones para obtener las horas, minutos y segundos que han transcurrido desde el primer día del mes hasta hoy (fecha actual).
La Base de Datos Oracle proporciona una serie de funciones que permiten manipular fechas para obtener distintos datos dentro de los PL-SQL Procedures en Oracle, revisaremos cada una de ellas en un nuevo artículo.
Te propongo que pruebes de inmediato estos ejemplos en tu Base de Datos con tus propias tablas, PL/SQL Procedure y PL/SQL Function, para que comiences a ejercitar la mano y aprendas a dominar esta nueva técnica en tus PL/SQL Procedures en Oracle.
Estoy muy interesado en conocer tu opinión y/o comentario sobre este artículo, también cuéntame sobre qué es lo que quieres saber de PL/SQL Procedures en Oracle y/o dime cuál es tu principal frustración a la hora de trabajar con PL/SQL Procedures en Oracle. Estaré muy atento respondiendo tus preguntas y/o comentarios, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Director del Curso “Domina Tus Packages En Oracle“
yo necesito saber como hacer para comparar cuantas horas de diferencia hay entre dos fechas que se encuentran en mi tabla, en el comentario lo q hace es tomar dos fechas q ud mismo le setea, pero yo lo que quiero es sacar la fecha1(campo de mi tabla) y de ahi compararlo con fecha2(otro campo de la misma tabla perteneciente al mismo id de la tabla).
Hola Meche, gracias por comunicarte, en el ejemplo #2 muestro como restar fechas de una tabla, pero tu puedes hacer algo como lo siguiente:
select (((dat.tu_fecha_mayor – dat.tu_fecha_menor) + 1) * 24) total_horas
from tu_tabla dat
where tu_id = 123;
PD: Ya obtuviste mi reporte gratuito de ‘Cómo Construir un Select Eficiente en Oracle en Solo 7 Pasos’, si aún no lo has hecho puedes descargarlo desde aquí:
https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
bueno mira yo tengo que hacer un select donde si yo he dado iniciar en un boton se grabe la fecha en que le dio click pero ya al dia siguiente me le tiene que descontar un dia hasta que llegue a 3 dias que es el limite….
Hola Carol, gracias por comunicarte, no entiendo muy bien tu pregunta, pero si quieres grabar una fecha debes usar un insert o un update, si debes restar un día debes hacer un update de esta forma:
update tu_tabla
set campo_fecha= (campo_fecha – 1)
where
PD: Ya obtuviste mi libro gratis sobre ‘Cómo Construir un SELECT Eficiente en Oracle en Solo 7 Pasos’, si aún no lo haces puedes obtenerlo desde aquí:
https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Buenos días
Respecto a los vídeos trate de mirarlos pero no se pudo salia error
Hola Miguel, gracias por comunicarte, si entras a la página https://dominatuspackagesen0racle.com/select/video_1/ y el vídeo no se muestra debes actualizar la versión de Adobe Flash Player en tu navegador, entra al siguiente enlace https://get.adobe.com/es/flashplayer/ y sigue las indicaciones que están en español, por favor cuéntame si se solucionó en problema, gracias.
PD: No olvides dejarme tus comentarios al final de los vídeos y si te gustaron los vídeos comparte el enlace del vídeo con tus amigos o personas que también les pueda interesar.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
BUEN DIA, POR FAVOR QUIERO HACER UN TRIGGER PARA VALIDAR LA FECHA DE NACIMIENTO COMO PUEDO HACER LA LOGICA X FAVOR….
CREATE OR REPLACE TRIGGER validar_edad
BEFORE INSERT OR UPDATE OF fechanac_per on persona
FOR EACH ROW
DECLARE
v_minedad date := 121296;
begin
IF(:new.fechanac_per > (sysdate-6205)from dual)THEN
raise_application_error (-20725,’EL PASAJERO ES MENOR DE EDAD’);
END IF;
END;
Hola Nelson, gracias por comunicarte, creo que la lógica la estas aplicando bien solo tienes un problema en el if donde debes hacer lo siguiente:
— se obtiene la edad mínima —
select (sysdate-6205) into v_minedad from dual;
IF (:new.fechanac_per > v_minedad) THEN
PD: Ya obtuviste mi libro-reporte gratis sobre “Como Construir un SELECT Eficiente en Oracle en Solo 7 Pasos”, si aun no lo tienes puedes obtenerlo desde el enlace https://dominatuspackagesen0racle.com/, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Buenos días: Yo tengo una duda cual es la diferencia de un simple plsql y un procedimiento o un paquete, más alla que los dos últimos son objetos de base de datos y el primero no.
Lilliana
Hola Liliana, gracias por comunicarte, bueno creo que a nivel de código no hay diferencias, la diferencia esta en lo simple así como lo dices, ya que un simple plsql puede contener tal vez un update, insert, delete o un select para procesar algunos datos, mientras que un procedimiento o paquete están diseñados para procesar grandes cantidades de datos, contienen cursores, estructuras, cálculos, lógica de negocio, files, control de errores, reportes, logs, etc.
PD: Si te ha gustado el blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda ser útil este contenido, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Estos cortos artículos me parecen interesantes, principalmente cuando iniciamos en Oracle.
muchas gracias
Que tal Edgar, gracias por tu comentario, me da mucho gusto que esta información te sea de utilidad, si te ha gustado el blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar este contenido, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
Quisiera saber como sacar rangos por minutos, ejemplo tengo una data relacionada con registros de compras los cuales tienen sus montos por productos y cada una con sus respectivos fecha y hora de compra, lo que necesito es mostrar esos registro en rangos de 15 minutos para que me muestre todos los registros comprendidos dentro de ese rango, hice esta pequeña linea de codigo en el select:
H.FECHA >= TO_DATE(’03/03/2014 DD/MM/YYYY’,’09:00:00 HH24:MI:SS’) AND H.FECHA <= TO_DATE('03/03/2014 DD/MM/YYYY','09:15:00 HH24:MI:SS')
pero no me funcionó, asi que precedí a ponerla en el where con un between, pero si lo pongo en el where tendria que estar corriendo como 60 veces mi qry para sacar todos los rangos hasta las 23:59:00 y seria muy tedioso como comprenderas.
Te agradeceria mucho me respondieras mi comentario Gracias de antemano
Hola Miguel, gracias por comunicarte, no se entiende muy bien como quieres mostrar esos registros en rangos de 15 minutos, pero si quieres hacerlo todo en un solo query puedes hacer lo siguiente, obtén en un campo la hora to_char(fecha,’hh24:mi:ss’), luego ordenas la query por ese campo de hora y con un decode mostrar un mensaje que muestre los 15 minutos, ej. decode(to_char(fecha,’mi’),’15’,’15 minutos’,’ ‘).
PD: Ya pudiste ver mi libro-reporte sobre ‘Cómo Construir un SELECT Eficiente en ORACLE en Solo 7 Pasos’, si aún no lo tienes en tus manos puedes obtenerlo desde aquí: https://dominatuspackagesen0racle.com/
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.
muy interesante estos ejemplos porque he utilizado de otra manera ese calculo de fecha, pero con estos ejemplos me ayudo mas.
Hola Alvaro, gracias por comunicarte, me da mucho gusto ver que este artículo te sea de utilidad, si te ha gustado lo que has visto del blog te invito a compartir el enlace https://dominatuspackagesen0racle.com/ con tus amigos o personas que también les pueda interesar ver esta información, gracias.
Saludos
Roberto Vicencio – Para Tu Éxito con Oracle.