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?


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

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 ...)


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))


5
CAST(QuantityLevel AS NUMERIC(18,2))

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

3

Funciona tanto en postgresql como en Oracle

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

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.


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

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.



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,

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

0

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

SELECT STR(ceiling(123.415432875), 6, 2)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.