Usuário com melhor resposta
Formatar Decimal Sql

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 ?
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.brSe 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
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.brSe 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. -
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.1764Vejamos:
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 -
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.
-
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 !
-
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.brSe 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
-
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.brSe 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_ANTERIORValeu 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
-
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.brSe 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. -
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.brSe 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.- Editado Roberson Ferreira _Moderator sábado, 25 de agosto de 2012 01:46
-
Obs.: Por favor, não esqueça de votar nas respostas úteis.
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
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.br
Email: contato@robersonferreira.com.brSe 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.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
-
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.brSe 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. -
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.brSe 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 !