SQL - Redondeando a 2 decimales

222

Necesito convertir minutos a horas, redondeado a 2 decimales. También necesito mostrar solo hasta 2 números después del punto decimal. Entonces, si tengo minutos como 650, entonces las horas deberían ser 10.83

Esto es lo que tengo hasta ahora:

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

Pero en este caso, si mis minutos son, digamos, 630 horas, son 10.5000000. Pero lo quiero solo como 10.50 (después del redondeo). ¿Cómo logro esto?

usuario656523
fuente
3
¿Qué motor de base de datos estás usando?
Ja͢ck
1
Si es T-SQL, este es un duplicado de stackoverflow.com/questions/3190688/…
Cees Timmerman el

Respuestas:

378

¿No podrías lanzar tu resultado como numeric(x,2)? Dóndex <= 38

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

Devoluciones

10.500000   10.50
u07ch
fuente
8
Extraño. ya SELECT ROUND(630/60.0, 2);me da 10.50
Ja͢ck
44
@ u07ch ¿cuál es el propósito de usar round () cuando ya estás usando un yeso?
Ram
16
@Ram La pregunta no especificó el motor del servidor sql, razón por la cual destaqué el round v cast por sí solo. La conversión a numérico no redondea en todos los motores, por lo que si el número calculado era 10.809, obtendría 10.80 en lugar de 10.81, la pregunta requerida.
u07ch
1
@ u07ch Gracias por la respuesta detallada. Me ayudó.
Ram
8
cast(630/60.0 as numeric(36,2))es suficiente10,50
MrHIDEn
78

Al igual que con SQL Server 2012, puede usar la función de formato integrada :

SELECT FORMAT(Minutes/60.0, 'N2')

(solo para lecturas adicionales ...)

Matten
fuente
2
Tenga en cuenta que esto también introduce miles de separadores, por ejemplo1,757.47
8128
10
Usar '0.00' en lugar de 'N2' da dos decimales sin tener también el separador de miles.
8128
2
Parece convertir a cadena? que arruina el orden por.
blissweb
2
@blissweb No debería ser un problema, ya que puede ordenar en la columna original, no en la salida de la función Formatear.
Matten
25

puedes usar

select cast((630/60.0) as  decimal(16,2))
RAM
fuente
13
Declare @number float = 35.44987665;
Select round(@number,2) 
Abhishek Jaiswal
fuente
44
Considere agregar un poco de explicación a su respuesta.
Olivier De Meulder
3
En caso de decimal (10,6), ¿qué pasará?
Arijit Mukherjee
5
CAST(QuantityLevel AS NUMERIC(18,2))
Shahbaz Raees2
fuente
2
¡Bienvenido a Stack Overflow! Gracias por el fragmento de código, que puede proporcionar una ayuda limitada e inmediata. Una explicación adecuada mejoraría enormemente su valor a largo plazo al describir por qué esta es una buena solución al problema, y ​​la haría más útil para futuros lectores con otras preguntas similares. Edite su respuesta para agregar alguna explicación, incluidas las suposiciones que ha hecho.
Sepehr
4
DECLARE @porcentaje FLOAT

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

SELECT @porcentaje
Anastacio Valdez
fuente
3

Funciona tanto en postgresql como en Oracle

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

La siguiente consulta es útil y simple.

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

Da salida como 0.25.

ShaileshDev
fuente
3

Cualquier cosa que use en denominación debe estar en decimal, por ejemplo 1548/100, dará15.00

Si reemplazamos 100con 100.0en nuestro ejemplo, obtendremos15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0
nitin157
fuente
3

Convierte tu número a NumericoDecimal .

Reemplace su consulta con lo siguiente.

Servidor SQL

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

MySql:

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

La Castfunción es un contenedor para la Convertfunción. Combine eso con que SQL es un lenguaje interpretado y el resultado es que aunque las dos funciones producen los mismos resultados, hay algo más detrás de escena en la Castfunción. Usar la Convertfunción es un ahorro pequeño, pero los ahorros pequeños se multiplican.

WonderWorker
fuente
2

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

Quintin moodley
fuente
2

Como complemento de las respuestas a continuación, cuando use INT o tipos de datos no decimales en sus fórmulas, recuerde multiplicar el valor por 1 y el número de decimales que prefiera.

es decir, TotalPackageses an INTy, por lo tanto, el denominador TotalContainers, pero quiero que mi resultado tenga hasta 6 decimales.

así:

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

El siguiente fragmento podría ayudarte:

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
fuente
0

Encuentro que la función STR es el medio más limpio para lograr esto.

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