Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
MBMARTINS
Rank: Estagiário Pleno
Mensagens: 6 Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP
Sex, 13 Ago 2010 11:08 am
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
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
MBMARTINS
Rank: Estagiário Pleno
Mensagens: 6 Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP
Sex, 13 Ago 2010 11:37 am
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
Mensagens: 6 Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP
Sex, 13 Ago 2010 2:06 pm
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
Mensagens: 25 Registrado em: Qui, 21 Jan 2010 4:40 pm
Localização: Porto Alegre - RS
Sex, 13 Ago 2010 2:34 pm
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
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
Sex, 13 Ago 2010 4:09 pm
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
Mensagens: 6 Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP
Sex, 13 Ago 2010 4:30 pm
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
Mensagens: 6 Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP
Seg, 16 Ago 2010 1:09 pm
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
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
Seg, 16 Ago 2010 1:53 pm
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
Mensagens: 6 Registrado em: Sex, 13 Ago 2010 10:55 am
Localização: SJCampos - SP
Seg, 16 Ago 2010 2:02 pm
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
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
Seg, 16 Ago 2010 2:15 pm
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
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
natarelli
Rank: Estagiário Júnior
Mensagens: 1 Registrado em: Qui, 02 Set 2010 3:23 pm
Localização: RJ
Qui, 02 Set 2010 3:35 pm
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
Mensagens: 229 Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Qui, 02 Set 2010 4:25 pm
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
Mensagens: 1396 Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
Qui, 02 Set 2010 4:27 pm
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
Mensagens: 229 Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Qui, 02 Set 2010 4:33 pm
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
victorhugomuniz
Moderador
Mensagens: 1396 Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
Qui, 02 Set 2010 4:35 pm
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
Mensagens: 229 Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes