Pular para o conteúdo

Fóruns SQL e PL/SQL Diferença de Data com horas e minutos Responder a: Diferença de Data com horas e minutos

#143489
Avatar photoJosé Laurindo Chiappa
Moderador

    É super-bico : o que vc TEM que saber é que quando vc faz a Subtração de duas datas, o Oracle te retorna um NÚMERO cuja parte Inteira é a quantidade de dias E a fração é o quanto de um dia sobrou….
    Como o dia tem 24 horas, o cálculo de HORAS é simplesmente pegar a parte INTEIRA desse cálculo e multiplicar por 24, que são as 24 horas do dia…
    Já o cálculo de MINUTOS é repetir o cálculo de Horas (com a variação de que PODE ou não haver a porção inteira) e multiplicar por 60, a quantidade de horas vezes 60 dá os minutos….

    Como Exemplo, vamos ter uma massa de dados onde há intervalos com menos de um dia, com mais de um dias, com mais de dois dias, com minutos fracionados e sem minutos fracionados :

    scott@DESENV:SQL>create table T(start_date date, end_date date);
    
    Tabela criada.
    
    scott@DESENV:SQL>insert into T values(to_date('01/06/2006 11:00','DD/MM/yyyy HH24:MI'), to_date('02/06/2006 10:30','DD/MM/yyyy HH24:MI') );
    
    1 linha criada.
    
    scott@DESENV:SQL>insert into T values(to_date('01/06/2006 10:30','DD/MM/yyyy HH24:MI'), to_date('02/06/2006 14:00','DD/MM/yyyy HH24:MI') );
    
    1 linha criada.
    
    scott@DESENV:SQL>insert into T values(to_date('01/06/2006 10:10','DD/MM/yyyy HH24:MI'), to_date('02/06/2006 13:50','DD/MM/yyyy HH24:MI') );
    
    1 linha criada.
    
    scott@DESENV:SQL>insert into T values(to_date('03/06/2006 10:00','DD/MM/yyyy HH24:MI'), to_date('03/06/2006 13:00','DD/MM/yyyy HH24:MI') );
    
    1 linha criada.
    
    scott@DESENV:SQL>insert into T values(to_date('04/06/2006 10:10','DD/MM/yyyy HH24:MI'), to_date('07/06/2006 13:50','DD/MM/yyyy HH24:MI') );
    
    1 linha criada.
    
    scott@DESENV:SQL>insert into T values(to_date('05/06/2006 08:00','DD/MM/yyyy HH24:MI'), to_date('06/06/2006 08:00','DD/MM/yyyy HH24:MI') );
    
    1 linha criada.
    
    scott@DESENV:SQL>insert into T values(to_date('05/06/2006 08:10','DD/MM/yyyy HH24:MI'), to_date('05/06/2006 08:12','DD/MM/yyyy HH24:MI') );
    
    1 linha criada.
    
    scott@DESENV:SQL>insert into T values(to_date('06/06/2006 08:00','DD/MM/yyyy HH24:MI'), to_date('09/06/2006 09:12','DD/MM/yyyy HH24:MI') );
    
    1 linha criada.

    => Eis a consulta implementando a lógica que indiquei :

    scott@DESENV:SQL>select start_date, end_date,
    2   trunc( 24* (end_date - start_date))                as HORAS,
    3   trunc( mod(mod(end_date - start_date,1)*24,1)*60 ) as MINUTOS
    4  from T;
    
    START_DATE          END_DATE            HORAS     MINUTOS
    ------------------- ------------------- --------- ---------
    01/06/2006 11:00:00 02/06/2006 10:30:00 23        30
    01/06/2006 10:30:00 02/06/2006 14:00:00 27        29
    01/06/2006 10:10:00 02/06/2006 13:50:00 27        40
    03/06/2006 10:00:00 03/06/2006 13:00:00 3         0
    04/06/2006 10:10:00 07/06/2006 13:50:00 75        40
    05/06/2006 08:00:00 06/06/2006 08:00:00 24        0
    05/06/2006 08:10:00 05/06/2006 08:12:00 0         2
    06/06/2006 08:00:00 09/06/2006 09:12:00 73        12
    
    8 linhas selecionadas.

    Blz ???

    Abraços,

    Chiappa