calculo de duas datas no formato HH:MM

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
MBMARTINS
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP

tenho duas datas explo

'13/05/2010 11:00' e '13/05/2010 17:30'

gostaria de exibir para o usuario no formato explo '48:00h'

tentei alguns codigos para fazer esse calculo mas não consigo estou desde as 8 procurando ate agora nada :(

fico grato se alguém me ajudar.

desde já grato.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Da uma olhada neste tópico

http://glufke.net/oracle/viewtopic.php? ... highlight=

Se não te ajudar posta aí.
MBMARTINS
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP

não só me fez ver que pode ter algo mais estranho ainda..


bom tenho duas datas a de entrada e de saida digitada pelo usuario que já esta cadastrada no banco.

estou emitindo um relatorio e querem esse tempo em horas tipo ele ficou 48 horas.

Selecionar tudo

SELECT TO_DATE('13/05/2010 09:35','HH12:MI:SS') - TO_DATE('13/05/2010 17:30','HH12:MI:SS') FROM dual 
a ideia.. mas depois tenho que passa para proc ainda.
MBMARTINS
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP

Selecionar tudo

SELECT TO_CHAR(date_diff('13/05/2010 09:35', '13/05/2010 17:00', MINUTE)/ 60) || ' : ' ||
       TO_CHAR(MOD(date_diff('13/05/2010 09:35', '13/05/2010 17:00',MINUTE),60))
FROM DUAL
tava falando com um cara desenvolve sql ele me passou o date diff mas não consigo chegar no resultado .

alguém?
LixX
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 21 Jan 2010 4:40 pm
Localização: Porto Alegre - RS

SENDO:

Selecionar tudo

dt_fim = to_date('14/05/2010 19:35','dd/mm/yyyy HH24:MI')
dt_ini = to_date('12/05/2010 10:35','dd/mm/yyyy HH24:MI')

Selecionar tudo

SELECT to_number(to_char(to_date('1','J') +
       (dt_fim - dt_ini), 'J') - 1)  dias,
       to_char(to_date('00:00:00','HH24:MI:SS') +
       (dt_fim - dt_ini), 'HH24:MI:SS') horas 
  FROM tabela_datas;
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Testa aí.

Selecionar tudo

SELECT TRUNC(((SYSDATE - (SYSDATE - 2 - (7 / 1440))) *24))||':'||to_char(ROUND(
((((SYSDATE - (SYSDATE - 2 - (7 / 1440))) *24) - TRUNC(((SYSDATE - (SYSDATE - 2 - (7 / 1440))) *24))) * 60)),'00') FROM   DUAL

MBMARTINS
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP

Obrigado SergioLBJr, LixX

Selecionar tudo

CREATE OR REPLACE PROCEDURE SP_038_DATA_HORAS(IN_DATA_INICIAL IN DATE,
                                              IN_DATA_FINAL   IN DATE,
                                              OUT_CURSOR      OUT Pa_Ecr_Cursor.CURSOR_ECR_TYPE)
 AS
 BEGIN
 
  OPEN OUT_CURSOR FOR
    SELECT TRIM(to_char(ROUND((TO_NUMBER(TO_DATE(IN_DATA_FINAL,
                                         'DD/MM/YYYY HH24:MI') -
                                 TO_DATE(IN_DATA_INICIAL,
                                         'DD/MM/YYYY HH24:MI')) * 1440) / 60), '00') 
           || ':' || 
           to_char(MOD(ROUND(TO_NUMBER(TO_DATE(IN_DATA_FINAL, 
                                         'DD/MM/YYYY HH24:MI') - 
                                    TO_DATE(IN_DATA_INICIAL, 
                                         'DD/MM/YYYY HH24:MI')) * 1440), 60), '00')) AS HORA
     FROM DUAL;
     
     END SP_038_DATA_HORAS;
Para ajudar alguém que prescise ta ai a proc.
MBMARTINS
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP

estava testando a proc achei um outro erro,

Selecionar tudo

data_inicial = 01/08/2010 12:59
data_final = 16/08/2010 12:59
a resposta sai (###:00)

alguém pode ajudar?
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

O problema aconteceu devido ao parâmetro do to_char

tenta ai.

Selecionar tudo

SELECT TRIM(to_char(ROUND((TO_NUMBER(TO_DATE(IN_DATA_FINAL, 
                                         'DD/MM/YYYY HH24:MI') - 
                                 TO_DATE(IN_DATA_INICIAL, 
                                         'DD/MM/YYYY HH24:MI')) * 1440) / 60), '0000') 
           || ':' || 
           to_char(MOD(ROUND(TO_NUMBER(TO_DATE(IN_DATA_FINAL, 
                                         'DD/MM/YYYY HH24:MI') - 
                                    TO_DATE(IN_DATA_INICIAL, 
                                         'DD/MM/YYYY HH24:MI')) * 1440), 60), '0000')) AS HORA 
     FROM DUAL; 
MBMARTINS
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP

Sim eu tentei isso porem não deu nada..

coloquei assim funcionou porque o to_char esta travando para ser duas casas e um campo char agora está como numerico.

Selecionar tudo

SELECT ROUND((TO_NUMBER(TO_DATE(IN_DATA_FINAL,
                                         'DD/MM/YYYY HH24:MI') -
                                 TO_DATE(IN_DATA_INICIAL,
                                         'DD/MM/YYYY HH24:MI')) * 1440) / 60)
           || ':' || 
           TRIM(TO_CHAR(MOD(ROUND(TO_NUMBER(TO_DATE(IN_DATA_FINAL, 
                                         'DD/MM/YYYY HH24:MI') - 
                                    TO_DATE(IN_DATA_INICIAL, 
                                         'DD/MM/YYYY HH24:MI')) * 1440), 60), '00')) AS HORA
     FROM DUAL;
conversei com o analista ele disse que não há problema na primeira casa ser com um digito.

Valeu a grande ajuda Sergio.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

O problema aconteceu devido ao parâmetro do to_char

tenta ai.

Selecionar tudo

SELECT TRIM(to_char(ROUND((TO_NUMBER(TO_DATE(IN_DATA_FINAL, 
                                         'DD/MM/YYYY HH24:MI') - 
                                 TO_DATE(IN_DATA_INICIAL, 
                                         'DD/MM/YYYY HH24:MI')) * 1440) / 60), '0000') 
           || ':' || 
           to_char(MOD(ROUND(TO_NUMBER(TO_DATE(IN_DATA_FINAL, 
                                         'DD/MM/YYYY HH24:MI') - 
                                    TO_DATE(IN_DATA_INICIAL, 
                                         'DD/MM/YYYY HH24:MI')) * 1440), 60), '0000')) AS HORA 
     FROM DUAL; 
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Ops resposta repetida. :?
natarelli
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 02 Set 2010 3:23 pm
Localização: RJ

Senhores,
Também estou quebrando a cabeça para montar uma procedure que funcione, contudo sempre surge uma divergência no resultado.
Por exemplo essa procedure postada funciona se os minutos forem menor que 30, se forem mair retorna uma hora a mais.

Exemplo:

Selecionar tudo

SELECT TRIM(to_char(ROUND((TO_NUMBER(TO_DATE('01/06/2006 12:31', 
                                         'DD/MM/YYYY HH24:MI') - 
                                 TO_DATE('01/06/2006 12:00', 
                                         'DD/MM/YYYY HH24:MI')) * 1440) / 60), '0000') 
           || ':' || 
           to_char(MOD(ROUND(TO_NUMBER(TO_DATE('01/06/2006 12:31', 
                                         'DD/MM/YYYY HH24:MI') - 
                                    TO_DATE('01/06/2006 12:00', 
                                         'DD/MM/YYYY HH24:MI')) * 1440), 60), '0000')) AS HORA 
     FROM DUAL
RESULTADO = 0001:0031
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Tenta assim...

Selecionar tudo

SQL> SELECT TO_CHAR(TRUNC(SYSDATE) + (data_fim - data_ini) * 1440 / 60 / 24, 'hh24:mi:ss') retorno
  2    FROM (SELECT TO_DATE('02-sep-2010 13:00:00', 'dd-mon-rrrr hh24:mi:ss') data_ini
  3                ,TO_DATE('02-sep-2010 15:30:00', 'dd-mon-rrrr hh24:mi:ss') data_fim
  4            FROM dual);
 
RETORNO
--------
02:30:00
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

a sua solução com o problema resolvido pelo Diego_Mello...

Selecionar tudo

SELECT TRIM(to_char(ROUND((TO_NUMBER(TO_DATE('01/06/2006 12:31',
'DD/MM/YYYY HH24:MI') -
TO_DATE('01/06/2006 12:00',
'DD/MM/YYYY HH24:MI')) * 1440) / 60 / 24), '0000')
|| ':' ||
to_char(MOD(ROUND(TO_NUMBER(TO_DATE('01/06/2006 12:31',
'DD/MM/YYYY HH24:MI') -
TO_DATE('01/06/2006 12:00',
'DD/MM/YYYY HH24:MI')) * 1440), 60), '0000')) AS HORA
FROM DUAL; 
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Galera...
Pensando um pouco agora... (antes fiz no correrio)..

60 * 24 = 1440, não é??
euaheuaheuaheu

Então...

Selecionar tudo

SQL> SELECT TO_CHAR(TRUNC(SYSDATE) + (data_fim - data_ini), 'hh24:mi:ss') retorno
  2    FROM (SELECT TO_DATE('02-sep-2010 13:00:00', 'dd-mon-rrrr hh24:mi:ss') data_ini
  3                ,TO_DATE('02-sep-2010 15:30:00', 'dd-mon-rrrr hh24:mi:ss') data_fim
  4            FROM dual);
 
RETORNO
--------
02:30:00
:P
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

começa a abrir e fechar muito parenteses fica ruim ne!?!?!
aheuaheuaheuaheuahe

Selecionar tudo

SELECT TRIM(to_char(ROUND((TO_NUMBER(TO_DATE('01/06/2006 12:31',
'DD/MM/YYYY HH24:MI') -
TO_DATE('01/06/2006 12:00',
'DD/MM/YYYY HH24:MI')))), '0000')
|| ':' ||
to_char(MOD(ROUND(TO_NUMBER(TO_DATE('01/06/2006 12:31',
'DD/MM/YYYY HH24:MI') -
TO_DATE('01/06/2006 12:00',
'DD/MM/YYYY HH24:MI')) * 1440), 60), '0000')) AS HORA
FROM DUAL; 
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Sim.
XGH é o que há! :-o
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante