Arredondando para 2 casas decimais

222

Eu preciso converter minutos para horas, arredondado para 2 casas decimais. Também preciso exibir apenas até 2 números após o ponto decimal. Então, se eu tiver minutos como 650, então as horas devem ser 10,83

Aqui está o que eu tenho até agora:

Select round(Minutes/60.0,2) from ....

Mas, neste caso, se meus minutos são, digamos, 630 horas, são 10,5000000. Mas eu quero apenas 10,50 (após o arredondamento). Como faço para conseguir isso?

user656523
fonte
3
Qual mecanismo de banco de dados você está usando?
Jack
1
Se T-SQL, esta é uma duplicata de stackoverflow.com/questions/3190688/… #
486 Cees Timmerman

Respostas:

378

Não foi possível transmitir o resultado como numeric(x,2)? Ondex <= 38

select 
    round(630/60.0,2), 
    cast(round(630/60.0,2) as numeric(36,2))

Devoluções

10.500000   10.50
u07ch
fonte
8
Estranho. já SELECT ROUND(630/60.0, 2);me dá 10.50.
Jack
4
@ u07ch qual é o objetivo de usar round () quando você já está usando um elenco?
Ram
16
@Ram A questão não especificou o mecanismo do servidor sql - e é por isso que destaquei a rodada v cast por conta própria. A conversão para numérico não faz arredondamentos em todos os mecanismos; portanto, se o número calculado for 10,809, você receberá 10,80 em vez dos 10,81 que a pergunta exigia.
U07ch 26/08/14
1
@ u07ch Obrigado pela resposta detalhada. isso me ajudou.
Ram
8
cast(630/60.0 as numeric(36,2))é 10,50
suficiente
78

Assim como no SQL Server 2012, você pode usar a função de formato interno :

SELECT FORMAT(Minutes/60.0, 'N2')

(apenas para leituras adicionais ...)

Matten
fonte
2
Observe que isso também introduz milhares de separadores, por exemplo:1,757.47
8128 25/01
10
Usar '0,00' em vez de 'N2' fornece duas casas decimais sem também ter o separador de milhares.
8128
2
Parece converter em string? que estraga a ordem por.
precisa saber é
2
@blissweb Não deve ser um problema, como você pode solicitar na coluna original, não na saída da função Format.
precisa
25

você pode usar

select cast((630/60.0) as  decimal(16,2))
RAM
fonte
13
Declare @number float = 35.44987665;
Select round(@number,2) 
Abhishek Jaiswal
fonte
4
Considere adicionar um pouco de explicação à sua resposta.
Olivier De Meulder
3
Em caso de decimal (10,6), o que acontecerá?
Arijit Mukherjee
5
CAST(QuantityLevel AS NUMERIC(18,2))
Shahbaz Raees2
fonte
2
Bem-vindo ao Stack Overflow! Obrigado pelo snippet de código, que pode fornecer ajuda imediata e limitada. Uma explicação adequada melhoraria bastante seu valor a longo prazo , descrevendo por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com outras perguntas semelhantes. Edite sua resposta para adicionar alguma explicação, incluindo as suposições que você fez.
sepehr
4
DECLARE @porcentaje FLOAT

SET @porcentaje = (CONVERT(DECIMAL,ABS(8700)) * 100) / CONVERT(DECIMAL,ABS(37020))

SELECT @porcentaje
Anastacio Valdez
fonte
3

Funciona tanto no postgresql quanto no Oracle

SELECT ename, sal, round(((sal * .15 + comm) /12),2) 
FROM emp where job = 'SALESMAN' 
manas mukherjee
fonte
3

A consulta a seguir é útil e simples

declare @floatExchRate float;
set @floatExchRate=(select convert(decimal(10, 2), 0.2548712))
select  @floatExchRate

Dá saída como 0,25.

ShaileshDev
fonte
3

O que quer que você use na denominação deve ser decimal, por exemplo 1548/100, dará15.00

Se substituirmos 100por 100.0nosso exemplo, obteremos15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0
nitin157
fonte
3

Converta seu número para um Numericou Decimal.

Substitua sua consulta pelo seguinte.

Servidor SQL

Select Convert(Numeric(38, 2), Minutes/60.0) from ....

MySql:

Select Convert(Minutes/60.0, Decimal(65, 2)) from ....

A Castfunção é um invólucro para a Convertfunção. Junte isso ao fato de o SQL ser uma linguagem interpretada e o resultado é que, embora as duas funções produzam os mesmos resultados, há um pouco mais nos bastidores da Castfunção. O uso da Convertfunção é uma pequena economia, mas pequenas economias se multiplicam.

WonderWorker
fonte
2

tente isto: SELECT CAST(ROUND([Amount 1]/60,2) AS DECIMAL(10,2)) as TOTAL

Quintin moodley
fonte
2

Como complemento das respostas abaixo, ao usar tipos de dados INT ou não-decimais em suas fórmulas, lembre-se de multiplicar o valor por 1 e o número de casas decimais que você preferir.

ie - TotalPackagesé um INTe, portanto, o denominador TotalContainers, mas quero que meu resultado tenha até 6 casas decimais.

portanto:

((m.TotalPackages * 1.000000) / m.TotalContainers) AS Packages,
Fandango68
fonte
1

O seguinte trecho pode ajudá-lo:

select SUBSTR(ENDDTTM,1, 9), extract(DAY FROM (ENDDTTM)), ENDDTTM, BEGINDTTM,  (ENDDTTM - BEGINDTTM),substr(BEGINDTTM, 1,15), substr((ENDDTTM - BEGINDTTM), 12, 8),
round((substr((ENDDTTM - BEGINDTTM), 12, 2)* 3600 + substr((ENDDTTM - BEGINDTTM), 15, 2)*60 +  substr((ENDDTTM - BEGINDTTM), 18, 2)),2) as seconds,
round((substr((ENDDTTM - BEGINDTTM), 12, 2)* 60 + substr((ENDDTTM - BEGINDTTM), 15, 2) +  substr((ENDDTTM - BEGINDTTM), 18, 2)/60 ), 2)as minutes,
round((substr((ENDDTTM - BEGINDTTM), 12, 2) + substr((ENDDTTM - BEGINDTTM), 15, 2)/60 +  substr((ENDDTTM - BEGINDTTM), 18, 2)/3600 ),2)  as hours
Venkat
fonte
0

Acho que a função STR é o meio mais limpo de conseguir isso.

SELECT STR(ceiling(123.415432875), 6, 2)
idro2k
fonte