Entrar

OracleBR

Dicas e Exemplos

Inicial - Banco de Códigos

DATAS&HORAS

Data de Inclusão: 02/09/2006 | Última Alteração: 02/09/2006
Tipo:Dicas e Exemplos | Enviada por: Moderador Oracle_br (moderador@oraclebr.com.br)


/* ALGUNS EXEMPLOS DE CALCULOS COM DATA E HORA QUE PASSARAM PELO GRUPO ORACLE_BR


FUNCTION subtrai_data (data1 in date,data2 in date)
RETURN varchar2 IS
/* Ex: 20/07/2001 17:00 - 24/07/2001 17:02 = 96:02 */
BEGIN
if data1 is not null and data2 is not null then
return(substr(to_char(abs(data1-data2)*24,'00D00000'),2,2)||':'||
lpad(round(to_number(substr(to_char(abs(data1-data2)*24,'00D00000'),4,5))*60 ),2,'0'));
else
return('00:00');
end if;
end;

--------------------------------------------------------------------------------------------------------------------------

FUNCTION soma_hora (hora1 in varchar2, hora2 in varchar2)
RETURN varchar2 IS
/* Ex: 32:15 + 12:45 = 45:00 */
BEGIN
return(trunc(((substr(hora1,4,2)* 0.01667)+substr(hora1,1,2))
+ ((substr(hora2,4,2)* 0.01667)+substr(hora2,1,2)))||':'||
lpad(nvl(trunc(substr(((substr(hora1,4,2)* 0.01667)
+substr(hora1,1,2))+ ( (substr(hora2,4,2)* 0.01667)
+substr(hora2,1
,2)),3,5)*60),0),2,'0'));
END;


--------------------------------------------------------------------------------------------------------------------------


/* Para somar horas sobre uma data:
EX: (01/01/2000 12:00) + 25:00 = 02/01/2000 13:00*/

:data :=(:data+to_number(to_char(:DATA2,'hh24'))/24 +
to_number(to_char(:DATA2,'mi'))/(24*60) +
to_number(to_char(:DATA2,'ss'))/(24*60*60));



--------------------------------------------------------------------------------------------------------------------------

create function F_Hora(pDtIni date, pDtFim date) return varchar2 is
nHoras number;
begin
nHoras:=trunc((pDtFim-pDtIni)*24);
return to_char(nHoras,'900')||
to_char(to_date('01/01/0001','DD/MM/YYYY')+(pDtFim-pDtIni),':MI:SS');
end;

--------------------------------------------------------------------------------------------------------------------------

/* CALCULAR IDADE DE UMA PESSOA */

SELECT TRUNC(MONTHS_BETWEEN
(TO_DATE('24-07-2001','DD-MM-YYYY'),
TO_DATE('27-04-1970','DD-MM-YYYY') ) / 12) Idade
FROM DUAL;

--------------------------------------------------------------------------------------------------------------------------
/*Função para contar os dias (sábado,domingo) entre dois periodos*/

CREATE FUNCTION F_CONTADIA (dia NUMBER, data_ini DATE, data_fim DATE) RETURN
NUMBER IS
datax DATE;
cont NUMBER;
BEGIN
datax:= data_ini;
cont:= 0;
WHILE datax <= data_fim LOOP
IF TO_NUMBER(TO_CHAR(datax, 'D')) = dia THEN
cont:= cont + 1;
END IF;
datax:= datax + 1;
END LOOP;
RETURN(cont);
END;

/* Ex:
select f_contadia(7,'01/01/2000',sysdate)Total_sabado from dual;
*/


--------------------------------------------------------------------------------------------------------------------------
/*Preciso atualizar uma tabela, alterando a hora de uma coluna,
dependendo da condição. A coluna foi criada com datatype DATE. As
inserções foram feitas no formato 'dd/mm/yyyy hh24:mi:ss'. Se a
condição for 'x', somar 4 horas, se for 'y', subtrair 1 hora.*/
Tente executar o seguinte teste:

-- acrescenta 4 horas ao meio-dia
select to_char(to_date('28/11/2000 12:00','DD/MM/RRRR
HH24:MI')+.1667,'DD/MM/RRRR HH24:MI') hora
from dual;

-- diminui 1 hora do meio-dia
select to_char(to_date('28/11/2000 12:00','DD/MM/RRRR
HH24:MI')-.0416,'DD/MM/RRRR HH24:MI') hora
from dual;

Atenciosamente,

Luis Alexandre Fontes
OCP - Oracle Certified Professional

--------------------------------------------------------------------------------------------------------------------------




----- Original Message -----
From: Marco Antonio Bianchini
To: 'oracle_br@yahoogrupos.com.br'
Sent: Thursday, May 23, 2002 9:56 AM
Subject: RES: [oracle_br] Subtrair hora.


Se for até 24 horas pode ser assim :
SQL> DECLARE
2 dt_ini date := to_date('01/05/2002 09:12:12', 'DD/MM/YYYY
HH24:MI:SS');
3 Dt_fim date := to_date('02/05/2002 01:34:24', 'DD/MM/YYYY
HH24:MI:SS');
4 aux varchar2(10);
5 Begin
6 Dbms_output.put_line( to_char(trunc(dt_ini) + (dt_fim -
dt_ini),'HH24:Mi'));
7 End;
8
8 .
SQL> /
16:22

PL/SQL procedure successfully completed.


Se precisar algo com número total de horas pode usar este.

SQL> DECLARE
2 dt_ini date := to_date('01/05/2002 07:12:12', 'DD/MM/YYYY
HH24:MI:SS');
3 Dt_fim date := to_date('23/05/2002 09:34:24', 'DD/MM/YYYY
HH24:MI:SS');
4 BEGIN
5 Dbms_output.Put_LIne ( (trunc(Dt_fim)-trunc(Dt_ini))*24 + trunc(
mod( (Dt_fim - Dt_ini)*24,24 )) || ' horas, ' ||
6 trunc( mod( (Dt_fim - Dt_ini)*24*60,60 ))
|| ' Minuto(s) e ' ||
7 round( mod( (Dt_fim - Dt_ini)*24*60*60,60 ))
||' segundos ');
8 END;
9
9
9 .
SQL> /
530 horas, 22 Minuto(s) e 12 segundos

PL/SQL procedure successfully completed.


Marco.
-----------------------------------------------------------------------------
------------------------------------------------------------------------------

(92:10 - 50:02)

function f_hora (horai in varchar2,horaf in varchar2)
return varchar2 is
hora number(4,2);
minuto number(2);
begin
hora := to_number(substr(horai, 1,2)||','|| replace(abs(substr(horai, 4,2)* 0.01667),',',''))-
to_number(substr(horaf, 1,2)||','|| replace(abs(substr(horaf, 4,2)* 0.01667),',',''));

minuto := round(abs((trunc(hora)-hora))*60);

return(to_char(trunc(hora),'00')||':'||to_char(minuto,'00'));
end;