none
Formatar Decimal Sql RRS feed

  • Pergunta

  • boa tarde pessoal 

    tenho a consulta abaixo que esta arredondando o resultado para 66,00 sendo que teria que mostrar 65,58 ((22,30/34,00)*100)

    DECLARE @TB TABLE
     ( HR_MANUTENCAO TIME, HR_REQUERIDA TIME)
    INSERT INTO @TB(HR_MANUTENCAO,HR_REQUERIDA) VALUES  ('10:00:00','17:00:00')
     INSERT INTO @TB(HR_MANUTENCAO,HR_REQUERIDA) VALUES  ('12:30:00','17:00:00')
     SELECT * FROM @TBSELECT '(%) PERCENTUAL DISPONIVEL'AS EQUIPAMENTO, 
    ((CONVERT(DECIMAL(10,2),(SUM (CONVERT(DECIMAL,(datepart(hh,HR_MANUTENCAO)* 60) + (CONVERT(DECIMAL,(datepart(mi,HR_MANUTENCAO)))))))  / (CONVERT(DECIMAL(10,2),(SUM (CONVERT(DECIMAL,
    (datepart(hh,HR_REQUERIDA)* 60) + (CONVERT(DECIMAL,(datepart(mi,HR_REQUERIDA)))))))))))*100) AS TOTALFROM @TB

    Algeum tema uma solucao ?


    quinta-feira, 23 de agosto de 2012 20:17

Respostas

  • Mas você não pode fazer essa divisão desse jeito: 22:30h por 34:00h.

    Você está fazendo equivocadamente o cálculo 22,3 / 34.

    Só que 30 minutos não corresponde a 0,3: corresponde a 0,5.

    Já que 30 minutos é a metade de 1 hora, você deve considerar 0,5, que é a metade de 1.

    Dessa forma, se você dividir 22,5 por 34 (e multiplicar por 100) dará o resultado 66,18.

    Da mesma forma que transformando tudo para minutos.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta RJ_Silva terça-feira, 28 de agosto de 2012 00:57
    sexta-feira, 24 de agosto de 2012 23:25
    Moderador

Todas as Respostas

  • Rafael,

    acredito que o problema não está no Convert(Decimal(10,2)..., mas sim, no cálculo que está sendo feito: provavelmente não está dando o valor esperado e, como consequência, você tem o resultado de 66,00.

    Tente isolar partes do seu cálculo para confirmar se os valores são os esperados.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 23 de agosto de 2012 22:33
    Moderador
  • Bom dia Rafael,

    Seguindo a sua lógica vi que voce transforma as horas em minutos e soma, depois faz a divisão (h_manutenção / h_requerida). Se observar, no primeiro calculo temos 22 horas e 30 minutos, que seria (1.350 minutos) e na segunda situação temos 34 horas (2040 minutos). Então supomos que sua conta seria:
    select (1350.00 / 2040.00) * 100, que resultaria em 66.1764

    Vejamos:

    DECLARE @TB TABLE
     ( HR_MANUTENCAO DATETIME, HR_REQUERIDA DATETIME)
    INSERT INTO @TB(HR_MANUTENCAO,HR_REQUERIDA) VALUES  ('10:00:00','17:00:00')
    INSERT INTO @TB(HR_MANUTENCAO,HR_REQUERIDA) VALUES  ('12:30:00','17:00:00')
    
    SELECT 
    
    sum((CONVERT(DECIMAL(10,2),((CONVERT(DECIMAL,(datepart(hh,HR_MANUTENCAO)*CAST(60 AS DECIMAL)) + (CONVERT(DECIMAL,(datepart(mi,HR_MANUTENCAO))))))))))/
    sum((CONVERT(DECIMAL(10,2),( (CONVERT(DECIMAL,(datepart(hh,HR_REQUERIDA)* CAST(60 AS DECIMAL)) + (CONVERT(DECIMAL,(datepart(mi,HR_REQUERIDA)))))))))) * 100 AS TOTAL 
    FROM @TB

    Se eu interpretei errado, please me corrija.

    At.
    Rafael Melo

    sexta-feira, 24 de agosto de 2012 11:53
  • Rafael,

    Dei uma simplificada na tua consulta... Não sei porque você realizou a conversão de todos os valores para decimal, sendo que esse arredondamento só é preciso ser realizado após a divisão.

    Porém friso que o valor esperado não é 65,58, mas 66,18 (depois de convertido). Segue:

    DECLARE @TB TABLE
     ( HR_MANUTENCAO TIME, HR_REQUERIDA TIME)
    INSERT INTO @TB(HR_MANUTENCAO,HR_REQUERIDA) VALUES  ('10:00:00','17:00:00')
    INSERT INTO @TB(HR_MANUTENCAO,HR_REQUERIDA) VALUES  ('12:30:00','17:00:00')
    
    SELECT 
      convert(decimal(15,2),
        SUM ((datepart(hh,HR_MANUTENCAO)* 60.) + (datepart(mi,HR_MANUTENCAO)))
        /
        SUM ((datepart(hh,HR_REQUERIDA)* 60) + (datepart(mi,HR_REQUERIDA)))*100)
      AS TOTAL
    FROM @TB

    Veja que para retornar o valor no formato decima, apenas coloquei o '.' após o 60... informando que um dos valores é decimais, com isso o SQL Server já vai te retornar o resultado no formato.

    No final, fiz o convert para o formato como precisa.

    Espero que te ajude.

    []'s.

    sexta-feira, 24 de agosto de 2012 12:19
  • Rafael,

    Dei uma simplificada na tua consulta... Não sei porque você realizou a conversão de todos os valores para decimal, sendo que esse arredondamento só é preciso ser realizado após a divisão.

    Porém friso que o valor esperado não é 65,58, mas 66,18 (depois de convertido). Segue:

    DECLARE @TB TABLE
     ( HR_MANUTENCAO TIME, HR_REQUERIDA TIME)
    INSERT INTO @TB(HR_MANUTENCAO,HR_REQUERIDA) VALUES  ('10:00:00','17:00:00')
    INSERT INTO @TB(HR_MANUTENCAO,HR_REQUERIDA) VALUES  ('12:30:00','17:00:00')
    
    SELECT 
      convert(decimal(15,2),
        SUM ((datepart(hh,HR_MANUTENCAO)* 60.) + (datepart(mi,HR_MANUTENCAO)))
        /
        SUM ((datepart(hh,HR_REQUERIDA)* 60) + (datepart(mi,HR_REQUERIDA)))*100)
      AS TOTAL
    FROM @TB

    Veja que para retornar o valor no formato decima, apenas coloquei o '.' após o 60... informando que um dos valores é decimais, com isso o SQL Server já vai te retornar o resultado no formato.

    No final, fiz o convert para o formato como precisa.

    Espero que te ajude.

    []'s.

    Valeu por responder,

    Mas o seguinte se vc fizer a conta usando minutos realmente o resultado é 66,18 o estranho que se usar horas ou seja 22.30 / 34.00 o resultado será 65.58 

    alguma sugestao ?

    Obrigado pela atencao !

    sexta-feira, 24 de agosto de 2012 23:12
  • Mas você não pode fazer essa divisão desse jeito: 22:30h por 34:00h.

    Você está fazendo equivocadamente o cálculo 22,3 / 34.

    Só que 30 minutos não corresponde a 0,3: corresponde a 0,5.

    Já que 30 minutos é a metade de 1 hora, você deve considerar 0,5, que é a metade de 1.

    Dessa forma, se você dividir 22,5 por 34 (e multiplicar por 100) dará o resultado 66,18.

    Da mesma forma que transformando tudo para minutos.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta RJ_Silva terça-feira, 28 de agosto de 2012 00:57
    sexta-feira, 24 de agosto de 2012 23:25
    Moderador
  • Mas você não pode fazer essa divisão desse jeito: 22:30h por 34:00h.

    Você está fazendo equivocadamente o cálculo 22,3 / 34.

    Só que 30 minutos não corresponde a 0,3: corresponde a 0,5.

    Já que 30 minutos é a metade de 1 hora, você deve considerar 0,5, que é a metade de 1.

    Dessa forma, se você dividir 22,5 por 34 (e multiplicar por 100) dará o resultado 66,18.

    Da mesma forma que transformando tudo para minutos.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    Verdade Roberson nao tinha pensado nisso mas valeu... aproveito o topico aqui nessa mes consulta sabe me dizer como faco um subselect com essa mesma consula so mudando o WHERE tentei criar subconsulta mas nao conseguir indetificar o erro.

    PRECISO FAZER UM SUBSELECT SÓ MUDANDO A CONDICAO WHERE DE =@DATA_DIA_ANTERIOR PARA >@DATA_ACUM_MES
    OU SEJA UMA COLUNA PARA DISP_DIA_ANTERIOR E OUTRA PARA DISP_NO_MES

     ( convert(decimal(15,2),
        SUM ((datepart(hh,HR_MANUTENCAO)* 60.) + (datepart(mi,HR_MANUTENCAO)))
        /
        SUM ((datepart(hh,HR_REQUERIDA)* 60) + (datepart(mi,HR_REQUERIDA)))*100))AS DISP_NO_MES
    FROM @TB WHERE DATA < @DATA_DIA_ANTERIOR

    Valeu pela atencao

    DECLARE @MES_ATUAL INT = (SELECT DATEPART(MM,GETDATE()))
    DECLARE @ANO_ATUAL INT = (SELECT DATEPART(YY,GETDATE()))
    DECLARE @DATA_DIA_ANTERIOR DATETIME  =(SELECT CAST(CONVERT(VARCHAR,GETDATE() -1,103) AS DATETIME))
    DECLARE @DATA_ACUM_MES DATETIME = (SELECT CONVERT(VARCHAR(4),@ANO_ATUAL)+ '-'+ CONVERT(VARCHAR(2), @MES_ATUAL)+'-'+' 01')
    DECLARE @TB TABLE ( HR_MANUTENCAO TIME, HR_REQUERIDA TIME,DATA DATETIME)
     INSERT INTO @TB VALUES  ('10:00:00','17:00:00','20120810 00:00:00')
    INSERT INTO @TB VALUES  ('00:00:00','17:00:00','20120811 00:00:00')
    INSERT INTO @TB VALUES  ('10:20:00','09:00:00','20120810 00:00:00')
    INSERT INTO @TB VALUES  ('08:30:00','10:00:00','20120808 00:00:00')
    INSERT INTO @TB VALUES  ('10:40:00','14:00:00','20120824 00:00:00')
    INSERT INTO @TB VALUES  ('11:00:00','17:00:00','20120823 00:00:00')
    SELECT
     ( convert(decimal(15,2),    SUM ((datepart(hh,HR_MANUTENCAO)* 60.) + (datepart(mi,HR_MANUTENCAO)))    /    SUM ((datepart(hh,HR_REQUERIDA)* 60) + (datepart(mi,HR_REQUERIDA)))*100))AS DISP_DIA_ANTERIOR
     FROM @TB WHERE DATA = @DATA_DIA_ANTERIOR


    sábado, 25 de agosto de 2012 00:41
  • Desculpe, não entendi sua questão. Qual erro deu?

    Não sei se é a isso que está se referindo, mas verifiquei que há um erro na linha abaixo:

    DECLARE @DATA_DIA_ANTERIOR DATETIME  =(SELECT CAST(CONVERT(VARCHAR,GETDATE() -1,103) AS DATETIME))

    Esse erro acontece pois ao usar o estilo 103 a data é retornada em formato dd/mm/aaaa. Esse formato não é aceito como DateTime, uma vez que o idioma está em inglês. Bem, isso acontece no meu SQL (que está em inglês), mas pode ser que não aconteça com você.

    Se estiver acontecendo, altere o estilo para 101.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sábado, 25 de agosto de 2012 01:45
    Moderador
  • Obs.: Por favor, não esqueça de votar nas respostas úteis.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.


    sábado, 25 de agosto de 2012 01:45
    Moderador
  • Obs.: Por favor, não esqueça de votar nas respostas úteis.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    Acho que nao expliquei direito mas o que eu quis dizer que a consulta que postei funciona perfeitamente mas o que preciso é criar uma subconsulta (nova coluna com mesma consulta)o que irei mudar é somente a condicao ao inves de

    WHERE DATA = @DATA_DIA_ANTERIOR

    irei colocar

    WHERE DATA = @DATA_ACUM_MES

    mas a minha consulta tem que retornar duas colunas a primeira ja esta retornado e a

    segunda ira ser na condicao : WHERE DATA = @DATA_ACUM_MES as inves de WHERE DATA = @DATA_ACUM_MES

    Obrigado

    sábado, 25 de agosto de 2012 18:17
  • Rafael, faz um favor:

    como a Thread foi aberta sobre a formatação para decimal, e você já abriu outra Thread sobre esta questão de retornar duas colunas (http://social.technet.microsoft.com/Forums/pt-BR/520/thread/004d0067-f198-42f9-bf9f-18759340684e), feche este Thread marcando uma das respostas como "Resposta".

    Fica mais organizado se mantivermos um Thread para cada dúvida, facilitando pesquisas futuras de outros usuários. Obrigado.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 27 de agosto de 2012 00:58
    Moderador
  • Rafael, faz um favor:

    como a Thread foi aberta sobre a formatação para decimal, e você já abriu outra Thread sobre esta questão de retornar duas colunas (http://social.technet.microsoft.com/Forums/pt-BR/520/thread/004d0067-f198-42f9-bf9f-18759340684e), feche este Thread marcando uma das respostas como "Resposta".

    Fica mais organizado se mantivermos um Thread para cada dúvida, facilitando pesquisas futuras de outros usuários. Obrigado.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    Desculpe Roberson esqueci de marcar como Resposta .

    Obrigado pea atencao !

    terça-feira, 28 de agosto de 2012 01:38