Taí rei, de graça, 20 min pensando.
Na próxima paga a cerveja do happy hour
Não botei no padrão de nomeclatura aqui da empresa pois estava sem saco 
e com pressa para fazer logo, mas vc ajeita.


create or replace function fnsig_calc_hora_number(x in number, y in number)
    return number is
    result      number;
    horax       number;
    minx        number;
    segx        number;
    horay       number;
    miny        number;
    segy        number;
    horan       number;
    minn        number;
    segn        number;
    total_seg_x number;
    total_seg_y number;
    total_seg   number;
    tot_horan   number;
    tot_min     number;
begin
    horax := round(x / 10000);
    minx  := round((x - (horax * 10000)) / 100);
    segx  := x - (horax * 10000) - (minx * 100);

    horay := round(y / 10000);
    miny  := round((y - (horay * 10000)) / 100);
    segy  := y - (horay * 10000) - (miny * 100);

    total_seg_x := (horax * 3600) + (minx * 60) + segx;
    total_seg_y := (horay * 3600) + (miny * 60) + segy;

    --aqui você faz uma validação para caso x seja menor que y e o 
resultado fique negativo, o que seria errado

    total_seg := total_seg_x - total_seg_y;

    if total_seg < 3600 then
        horan     := 0;
        tot_horan := 0;
    else
        tot_horan := trunc(total_seg / 3600);
        horan     := tot_horan * 10000;
        tot_horan := tot_horan * 60 * 60;
    end if;

    if total_seg < 60 then
        minn    := 0;
        tot_min := 0;
    else
        tot_min := trunc(((total_seg - tot_horan) / 60), 0);
        minn    := tot_min * 100;
        tot_min := tot_min * 60;
    end if;
    segn := total_seg - tot_horan - tot_min;

    result := horan + minn + segn;
    return(result);
end fnsig_calc_hora_number;

rei_do_delphi escreveu:
> Boa tarde a todos, tenho uma tabela que tem um campo que armazena a
> data de alguma coisa, em formato number. Ex: 193104 para 19 horas, 31
> minutos e 04 segundos. Precisamos subtrair esse campo de outro campo
> que também contém hora nesse mesmo forma e também em number. Gostaria
> de saber se há alguma maneira de fazer isso sem uso de pl/sql, isto é,
> apenas por funções do oracle, ja sei que não funciona:
>
> select to_date(campo,'hh24miss') from tabela 
>
> pois ele reclama que a hora tem que estar entre 0 e 23. 
>
> Alguém pode me dar alguma ajuda?
> Obrigado a todos e abraço.
>
>
>
>   
>> Apostilas » Dicas e Exemplos » Funções » Mundo Oracle » Package » Procedure 
>> » Scripts » Tutoriais acesse: 
>> http://www.oraclebr.com.br/codigo/ListaCodigo.php 
>>     
> --------------------------------------------------------------------------------------------------------------------------
>   
>> Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>> responsabilidade de seus remetentes.
>>     
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
> --------------------------------------------------------------------------------------------------------------------------
>   
>> O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>> http://www.oraclebr.com.br/  
>>     
> ------------------------------------------------------------------------------------------------------------------------
>   
> Links do Yahoo! Grupos
>
>  
>
>
>
>   

Responder a