Jump to content
Sign in to follow this  
asacap1000

Calculo de dias horas e minutos entre datas no select

Recommended Posts

Salve Salve galera.

Estou com uma dificuldade em relação ao calculo entre datas.

No select estou trazendo tudo em minutos para depois calcular em dias, horas e minutos.

O resultado em dias está correto, o resultado em minutos tbm, agora o de horas fica fora de padrão.

vou colocar o select com o exemplo para melhor entendimento.

SELECT t.nr_da,
       t.id_klient,
       t.name,
       t.inicial,
       t.data_final,
       to_char(trunc(minutos_TO / 24 / 60), '009') dias,
       to_char(trunc(mod(minutos_TO, 3600) / 60), '09') horas,
       to_char(mod(mod(minutos_TO, 3600), 60), '09') minutos,
       t.stat,
       t.informacoes
  FROM (select KP.NR_DA,
               KL.ID_KLIENT,
               KL.NAME,
               TO_CHAR(DES.TIME_NEU, 'DD/MM/YYYY HH24:MI')INICIAL,
               case when kp.stat <> '90' then null else
               TO_CHAR(KP.TIME_NEU, 'DD/MM/YYYY HH24:MI') end DATA_FINAL,
               case when kp.stat <> '90' then TRUNC((sysdate - DES.TIME_NEU) * 1440) else
               TRUNC((KP.TIME_NEU - DES.TIME_NEU) * 1440)end minutos_TO,
               KP.STAT,
               to_char('DADOS DA OPERACAO') INFORMACOES
          from kit_plan KP, KLIENTEN KL, DESMEMBR DES
         WHERE KP.ID_KLIENT = KL.ID_KLIENT
           AND KP.NR_DA = '1603064496'
           and kp.stat NOT IN ('80','90')
           AND DES.ID_KLIENT = KP.ID_KLIENT
           AND DES.NR_DA = KP.NR_DA
           AND DES.TYP_PROCESS = 'DAENTR'
           AND TO_CHAR(KP.TIME_NEU, 'YYYY') = '2016') T ORDER BY t.inicial DESC 

Como resultado desta consulta eu tenho os seguintes dados.

DATA INICIAL: 01/03/2016 10:14

DATA FINAL: ESTÁ ABERTO

DIAS:237

HORAS:51

MINUTOS:49

As parte de hora está trazendo desconfigurado, como posso arrumar isso?

Share this post


Link to post
Share on other sites

Boa tarde,

Tenho uma função que calcula o intervalo, veja se ajuda alguma coisa.

create or replace 
function Fn_Intervalo_Tempo (P_Dt_Inic in date,
                             P_Dt_Fina in date) return varchar2 is
v_inte  number;
v_Hora  varchar2(200);
--
cursor c is
   SELECT lpad(   extract (day    from numtodsinterval(v_inte, 'day'))    ,5,' ') Qt_Dias,
          lpad(   extract (hour   from numtodsinterval(v_inte, 'day'))    ,2,'0') Qt_Horas,
          lpad(   extract (minute from numtodsinterval(v_inte, 'day' ))   ,2,'0') Qt_Minutos,
          lpad(   extract (second from numtodsinterval(v_inte, 'day'))    ,2,'0') Qt_Segundos
   FROM   dual;
c_r c%rowtype;
--
begin
--
v_inte := trunc((p_dt_Fina - p_dt_Inic),6);
dbms_output.put_line('v_inte     '||to_char(v_inte));
--
open c;
  fetch c into c_r;
   if c%found then
      --
      dbms_output.put_line('c_r.Qt_Dias     '||c_r.Qt_Dias);
      dbms_output.put_line('c_r.Qt_Horas    '||c_r.Qt_Horas);
      dbms_output.put_line('c_r.Qt_Minutos  '||c_r.Qt_Minutos);
      dbms_output.put_line('c_r.Qt_Segundos '||lpad(trunc(c_r.Qt_Segundos),2,'0'));
      --
      v_hora := c_r.Qt_Dias||' '||c_r.Qt_Horas||':'||c_r.Qt_Minutos||':'||lpad(trunc(c_r.Qt_Segundos),2,'0');
   end if;
close c;
return v_hora;
exception
when others then
  return 'erro';
End;
/

Só precisa ajustar o retorno para as suas necessidade.

Share this post


Link to post
Share on other sites

Boa tarde,

Tenho uma função que calcula o intervalo, veja se ajuda alguma coisa.

create or replace

function Fn_Intervalo_Tempo (P_Dt_Inic in date,

P_Dt_Fina in date) return varchar2 is

v_inte number;

v_Hora varchar2(200);

--

cursor c is

SELECT lpad( extract (day from numtodsinterval(v_inte, 'day')) ,5,' ') Qt_Dias,

lpad( extract (hour from numtodsinterval(v_inte, 'day')) ,2,'0') Qt_Horas,

lpad( extract (minute from numtodsinterval(v_inte, 'day' )) ,2,'0') Qt_Minutos,

lpad( extract (second from numtodsinterval(v_inte, 'day')) ,2,'0') Qt_Segundos

FROM dual;

c_r c%rowtype;

--

begin

--

v_inte := trunc((p_dt_Fina - p_dt_Inic),6);

dbms_output.put_line('v_inte '||to_char(v_inte));

--

open c;

fetch c into c_r;

if c%found then

--

dbms_output.put_line('c_r.Qt_Dias '||c_r.Qt_Dias);

dbms_output.put_line('c_r.Qt_Horas '||c_r.Qt_Horas);

dbms_output.put_line('c_r.Qt_Minutos '||c_r.Qt_Minutos);

dbms_output.put_line('c_r.Qt_Segundos '||lpad(trunc(c_r.Qt_Segundos),2,'0'));

--

v_hora := c_r.Qt_Dias||' '||c_r.Qt_Horas||':'||c_r.Qt_Minutos||':'||lpad(trunc(c_r.Qt_Segundos),2,'0');

end if;

close c;

return v_hora;

exception

when others then

return 'erro';

End;

/

Só precisa ajustar o retorno para as suas necessidade.

Mano a ídeia é muito boa porém vou utilizar o select em PHP e ainda não sei se é possível aplicar este recurso.

Share this post


Link to post
Share on other sites

Ok,

Tenta executar o SELECT assim:

SELECT t.nr_da,
t.id_klient,
t.name,
t.inicial,
t.data_final,
--
lpad( extract (day from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') dias,
lpad( extract (hour from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') horas,
lpad( extract (minute from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') minutos,
--
t.stat,
t.informacoes
from(
select KP.NR_DA,
KL.ID_KLIENT,
KL.NAME,
--
DES.TIME_NEU INICIAL,
--
case when kp.stat <> '90' then
sysdate
else
KP.TIME_NEU
end DATA_FINAL,
--
KP.STAT,
to_char('DADOS DA OPERACAO') INFORMACOES
--
from kit_plan KP, KLIENTEN KL, DESMEMBR DES
WHERE KP.ID_KLIENT = KL.ID_KLIENT
AND KP.NR_DA = '1603064496'
and kp.stat NOT IN ('80','90')
AND DES.ID_KLIENT = KP.ID_KLIENT
AND DES.NR_DA = KP.NR_DA
AND DES.TYP_PROCESS = 'DAENTR'
AND TO_CHAR(KP.TIME_NEU, 'YYYY') = '2016') T
ORDER BY t.inicial DESC
  • +1 2

Share this post


Link to post
Share on other sites

Ok,

Tenta executar o SELECT assim:

SELECT t.nr_da,
t.id_klient,
t.name,
t.inicial,
t.data_final,
--
lpad( extract (day from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') dias,
lpad( extract (hour from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') horas,
lpad( extract (minute from numtodsinterval((t.DATA_FINAL - t.INICIAL), 'day')) ,2,'0') minutos,
--
t.stat,
t.informacoes
from(
select KP.NR_DA,
KL.ID_KLIENT,
KL.NAME,
--
DES.TIME_NEU INICIAL,
--
case when kp.stat <> '90' then
sysdate
else
KP.TIME_NEU
end DATA_FINAL,
--
KP.STAT,
to_char('DADOS DA OPERACAO') INFORMACOES
--
from kit_plan KP, KLIENTEN KL, DESMEMBR DES
WHERE KP.ID_KLIENT = KL.ID_KLIENT
AND KP.NR_DA = '1603064496'
and kp.stat NOT IN ('80','90')
AND DES.ID_KLIENT = KP.ID_KLIENT
AND DES.NR_DA = KP.NR_DA
AND DES.TYP_PROCESS = 'DAENTR'
AND TO_CHAR(KP.TIME_NEU, 'YYYY') = '2016') T
ORDER BY t.inicial DESC

Perfeito!!!! Muito obrigado!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By Priscila1307
      CREATE TABLE CLIENTE( Idcliente int, nome varchar(60), dtnascimento date, cpf varchar(11), CONSTRAINT pk_cliente PRIMARY KEY (Idcliente) ); CREATE TABLE PEDIDO( Idpedido int, Idcliente int, datapedido date, vltotal decimal(10,2), CONSTRAINT pk_pedido PRIMARY KEY (Idpedido), CONSTRAINT fk_pedido_cliente FOREIGN KEY (Idcliente) REFERENCES CLIENTE(Idcliente) ); CREATE TABLE PRODUTO( Idproduto int, descricao varchar(100), quantidade int, CONSTRAINT pk_produto PRIMARY KEY (Idproduto) ); CREATE TABLE ITEMPEDIDO( Idpedido int, Nritem int, valor decimal(10,2), quantidade int, Idproduto int, CONSTRAINT pk_itempedido PRIMARY KEY (Idpedido, Nritem), CONSTRAINT fk_Idpedido FOREIGN KEY (Idpedido) REFERENCES PEDIDO (Idpedido), CONSTRAINT fk_itempedido_produto FOREIGN KEY (Idproduto) REFERENCES PRODUTO (Idproduto) ); CREATE TABLE LOG( Idlog int, data date, descricao varchar(255), CONSTRAINT pk_log PRIMARY KEY (Idlog) ); INSERT INTO CLIENTE VALUES (1, 'Hugo Batista', TO_DATE('05/02/1990', 'DD/MM/YYYY'), '51898608253'); INSERT INTO CLIENTE VALUES (2, 'José Antonio', TO_DATE('02/05/1985', 'DD/MM/YYYY'), '51144722241'); INSERT INTO CLIENTE VALUES (3, 'João Carlos', TO_DATE('03/05/1993', 'DD/MM/YYYY'), '84882273292'); INSERT INTO CLIENTE VALUES (4, 'Edivaldo Santana', TO_DATE('01/06/2000', 'DD/MM/YYYY'), '30609426176'); INSERT INTO CLIENTE VALUES (5, 'Cristina Oliveira', TO_DATE('16/08/1999', 'DD/MM/YYYY'), '56313586700'); INSERT INTO CLIENTE VALUES (6, 'Artur da Silva', TO_DATE('06/05/2001', 'DD/MM/YYYY'), '67491246583'); INSERT INTO CLIENTE VALUES (7, 'Adrina Domingues', TO_DATE('01/02/1972', 'DD/MM/YYYY'), '22044617250'); INSERT INTO PRODUTO VALUES (1, 'SAMSUNG J7 - PRIME', 10); INSERT INTO PRODUTO VALUES (2, 'SAMSUNG J5 - PRIME', 10); INSERT INTO PRODUTO VALUES (3, 'IPHONE X', 10); INSERT INTO PRODUTO VALUES (4, 'MOTO G 5S', 10); INSERT INTO PRODUTO VALUES (5, 'IPHONE 6S', 10); INSERT INTO PEDIDO VALUES (1, 4, TO_DATE('10/03/2018', 'DD/MM/YYYY'), 1400.99); INSERT INTO ITEMPEDIDO VALUES (1, 1, 800.99, 1, 1); INSERT INTO ITEMPEDIDO VALUES (1, 2, 600.00, 1, 2); INSERT INTO PEDIDO VALUES (2, 2, TO_DATE('17/03/2018', 'DD/MM/YYYY'), 1349.50); INSERT INTO ITEMPEDIDO VALUES (2, 1, 749.50, 1, 4); INSERT INTO ITEMPEDIDO VALUES (2, 2, 600.00, 1, 2); INSERT INTO PEDIDO VALUES (3, 1, TO_DATE('20/03/2018', 'DD/MM/YYYY'), 2590.10); INSERT INTO ITEMPEDIDO VALUES (3, 1, 1800.71, 1, 5); INSERT INTO ITEMPEDIDO VALUES (3, 2, 789.39, 1, 4); INSERT INTO PEDIDO VALUES (4, 5, TO_DATE('21/03/2018', 'DD/MM/YYYY'), 2590.10); INSERT INTO ITEMPEDIDO VALUES (4, 1, 5099.00, 1, 3); INSERT INTO PEDIDO VALUES (5, 7, TO_DATE('10/03/2018', 'DD/MM/YYYY'), 1800.00); INSERT INTO ITEMPEDIDO VALUES (5, 1, 600.00, 3, 2); "Crie um select que exibe quais são os três PRODUTOS com a maior quantidade de PEDIDOS. Exiba o nome e o código do produto"
       
      Oi pessoal. por favor preciso da ajuda de vocês . 
      Eu queria criar um SELECT que exiba os três PRODUTOS com a maior quantidade de PEDIDOS.
      Retornando nome do produto ( PRODUTO.DESCRICAO )  e  o código dele ( PRODUTO.IDPRODUTO )
       
      Eu tentei das seguintes formas mas não consegui . estou novinha ainda em oracle
       
       
      SELECT PRODUTO.DESCRICAO, PRODUTO.IDPRODUTO, ITEMPEDIDO.QUANTIDADE FROM ITEMPEDIDO, PEDIDO, PRODUTO WHERE ITEMPEDIDO.IDPEDIDO = PEDIDO.IDPEDIDO AND PRODUTO.IDPRODUTO = ITEMPEDIDO.IDPRODUTO GROUP BY IDPRODUTO  
      neste código só roda sem erro se eu tirar o GROUP BY IDPRODUTO.  Mas não gera o resultado esperado 

       
      SELECT ITEMPEDIDO.IDPRODUTO, COUNT(*) AS VENDIDO FROM ITEMPEDIDO GROUP BY IDPRODUTO ORDER BY VENDIDO DESC  
       
      Aqui eu até consegui chegar perto mas não consegui acrescentar o nome do produto ( que é PRODUTO.DESCRICAO) e o produto com idproduto 2 ( que é o J5 ) não são só 3 vendidos. SÃO 5 !!! ai ai ai ai
       
      ....e apos muita batalha eu consegui fazer isso ... que tbm ainda não é o ideal
       
      SELECT * FROM (SELECT ITEMPEDIDO.IDPRODUTO, COUNT(*) AS VENDIDO FROM ITEMPEDIDO GROUP BY IDPRODUTO ORDER BY VENDIDO DESC) WHERE ROWNUM <4  

       
      ... demorei horrores pra fazer esse WHERE ROWNUM <4  rodar sem erro... pois é pessoal. só historia triste ! kkkkk
       
       
      Agora estou tentando esse aqui mas não terminei 
       
      SELECT PRODUTO.DESCRICAO AS NOME, ITEMPEDIDO.IDPRODUTO FROM PRODUTO, ITEMPEDIDO WHERE PRODUTO.IDPRODUTO = ITEMPEDIDO.IDPRODUTO
       
       
      acabei parando no meio do caminho e decidi recorrer ao imasters ! 
       
      vou continuar tentando ... sera que consigo antes de alguem aparecer aqui ? rsrsrs
       
      obrigada ! boa sorte pessoal.
       
       
       
      ah ! já ia esquecendo estou usando o livesql.oracle.com
       
      e vou deixar aqui tbm a consulta das tabelas 
       
       

    • By Giovanird
      Estou quebrando a cabeça para fazer uma consulta em 2 colunas da mesma tabela.
      Preciso retornar a NOTA1 e NOTA2 consultando ambas colunas e listar sem repetir as notas vinculadas com cada série.

      TABELA ALUNOS
      COD |    CODSERIE  |  DATACADASTRO  |  NOTA1  |  NOTA2  
      1       |    2                  |  01/08/2021           |  5            |  3
      2       |    1                  |  11/08/2021           |  3            |  5
      3       |    2                  |  12/08/2021           |  5            |  3
      4       |    3                  |  15/08/2021           |  3            |  1
      5       |    2                  |  15/08/2021           |  5            |  3
      6       |    3                  |  18/08/2021           |  4            |  5
      7       |   2                   |  22/08/2021           |  2            |  3
      8       |   1                   |  12/08/2021           |  1            |  3
      9       |   2                   |  25/08/2021           |  5            |  6

      RETORNAR:
      SERIE 1
      Nota: 3
      Nota: 5
      Nota: 1
       
      SERIE 2
      Nota: 5
      Nota: 3
      Nota: 2
      Nota: 6
       
      SERIE 3
      Nota: 3
      Nota: 1
      Nota: 4
      Nota: 5
       
      Aqui tenho um foreach de outra tabela que devolve o codigo das séries e as notas para consulta foreach($rsserie as list($varserie,$varnota1,$varnota2)){ SELECT nota1, nota2 FROM alunos WHERE codserie like '$varserie' and (nota1 = '$varnota1' or nota1 = '$varnota2' or nota2 = '$varnota1' or nota2 = '$varnota2') Group by nota1, nota2 }  
    • By Kefatif
      Prezados, boa tarde.
       
      Utilizo um banco de dados Mysql + Programação PHP e HTML.
       
      Preciso que no filtro do sql ele não me traga o estoque do CNES "0000000", como eu poderia ta excluindo ele do filtro?
       
       
      $sqlestoque = "select A.ID_ESTOQUE, D.CNES, D.NOME_UNIDADE, B.COBERTURA, A.QTD, C.DATA_REGISTRO FROM lesao_rel_estoque_coberturas A INNER JOIN lesao_coberturas B ON A.ID_COBERTURA = B.ID_COBERTURA INNER JOIN lesao_estoque C ON A.ID_ESTOQUE = C.ID_ESTOQUE INNER JOIN unidades D ON C.CNES = D.CNES WHERE C.ID_ESTOQUE = (SELECT MAX(E.ID_ESTOQUE) FROM lesao_estoque E WHERE E.CNES = C.CNES) ORDER BY A.ID_ESTOQUE DESC";  
      Agradeço a ajuda desde já.
       
      Muito obrigado!
    • By lezão
      Bom dia, galera!
      Tudo bem com vcs?
       
      Tenho uma tabela Itens com os campos Descrição e nome do produto, quando eu coloco no select.
      Eu gostaria que me retorna-se, todos os nomes dos produtos e retornar apenas uma vez a Descrição.
       
      Select com ORDER BY
      "SELECT DISTINCT c.id, c.descricao, i.id_categoria, i.descricao_produto, i.id_item, i.nome_produto, i.imagem, i.preco, i.qntdade FROM tab_categoria AS c JOIN tab_itens AS i ON c.id = i.id_categoria WHERE c.id = i.id_categoria AND i.id_empresa = '$id_empresa' ORDER BY c.descricao" Select com GROUP BY,  até da certo, mas retorna apenas um produto.
      "SELECT DISTINCT c.id, c.descricao, i.id_categoria, i.descricao_produto, i.id_item, i.nome_produto, i.imagem, i.preco, i.qntdade FROM tab_categoria AS c JOIN tab_itens AS i ON c.id = i.id_categoria WHERE c.id = i.id_categoria AND i.id_empresa = '$id_empresa' GROUP BY c.descricao"  
      Veja como esta ficando do jeito que eu estou fazendo, com ORDER BY
      Select_com_ORDER_BY  
       
      E com o GROUP BY
      Select_com_GROUP_BY
       
    • By gamesmax2
      Boa noite,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome having status = 'Ok'
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.