SQL - Arrondi à 2 décimales

222

J'ai besoin de convertir les minutes en heures, arrondies à 2 décimales. Je dois également afficher uniquement jusqu'à 2 chiffres après la virgule. Donc, si je dispose de 650 minutes, les heures devraient être de 10,83.

Voici ce que j'ai jusqu'à présent:

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

Mais dans ce cas, si mes minutes sont, disons, 630 - les heures sont 10,5000000. Mais je veux seulement 10,50 (après arrondi). Comment puis-je y parvenir?

user656523
la source
3
Quel moteur de base de données utilisez-vous?
Ja͢ck
1
Si T-SQL, il s'agit d'un doublon de stackoverflow.com/questions/3190688/…
Cees Timmerman

Réponses:

378

Pourriez-vous pas diffuser votre résultat comme numeric(x,2)? Oùx <= 38

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

Retour

10.500000   10.50
u07ch
la source
8
Étrange. SELECT ROUND(630/60.0, 2);me donne 10.50déjà.
Ja͢ck
4
@ u07ch quel est le but d'utiliser round () lorsque vous utilisez déjà un casting?
Ram
16
@Ram La question ne spécifiait pas le moteur du serveur SQL - c'est pourquoi j'ai mis en évidence le cast v rond par lui-même. La conversion en numérique ne fait pas d'arrondi dans tous les moteurs, donc si le nombre calculé était 10.809, vous obtiendrez 10.80 plutôt que 10.81, la question requise.
u07ch
1
@ u07ch Merci pour la réponse détaillée. ça m'a aidé.
Ram
8
cast(630/60.0 as numeric(36,2))est assez10,50
MrHIDEn
78

Comme avec SQL Server 2012, vous pouvez utiliser la fonction de formatage intégrée :

SELECT FORMAT(Minutes/60.0, 'N2')

(juste pour d'autres lectures ...)

Matten
la source
2
Notez que cela introduit également des milliers de séparateurs, par exemple1,757.47
8128
10
L'utilisation de «0,00» plutôt que de «N2» donne deux décimales sans avoir également le séparateur des milliers.
8128
2
Semble convertir en chaîne? qui fout en ordre.
blissweb
2
@blissweb Cela ne devrait pas être un problème car vous pouvez commander sur la colonne d'origine, pas sur la sortie de la fonction Format.
Matten
25

vous pouvez utiliser

select cast((630/60.0) as  decimal(16,2))
RAM
la source
13
Declare @number float = 35.44987665;
Select round(@number,2) 
Abhishek Jaiswal
la source
4
Pensez à ajouter un peu d'explication à votre réponse.
Olivier De Meulder
3
En cas de décimale (10,6) que se passera-t-il?
Arijit Mukherjee
5
CAST(QuantityLevel AS NUMERIC(18,2))
Shahbaz Raees2
la source
2
Bienvenue dans Stack Overflow! Merci pour l'extrait de code, qui pourrait fournir une aide immédiate limitée. Une explication appropriée améliorerait considérablement sa valeur à long terme en décrivant pourquoi il s'agit d'une bonne solution au problème, et la rendrait plus utile aux futurs lecteurs ayant d'autres questions similaires. Veuillez modifier votre réponse pour ajouter des explications, y compris les hypothèses que vous avez faites.
sepehr
4
DECLARE @porcentaje FLOAT

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

SELECT @porcentaje
Anastacio Valdez
la source
3

Fonctionne à la fois avec postgresql et Oracle

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

La requête suivante est utile et simple-

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

Donne une sortie de 0,25.

ShaileshDev
la source
3

Tout ce que vous utilisez en dénomination doit être en décimal, par exemple vous 1548/100donnera15.00

Si nous remplaçons 100par 100.0dans notre exemple, nous obtiendrons15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0
nitin157
la source
3

Convertissez votre numéro en un NumericouDecimal .

Remplacez votre requête par ce qui suit.

Serveur SQL

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

MySql:

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

La Castfonction est un wrapper pour la Convertfonction. Ajoutez à cela que SQL est un langage interprété et le résultat est que même si les deux fonctions produisent les mêmes résultats, il se passe un peu plus de choses en arrière-plan dans la Castfonction. L'utilisation de la Convertfonction est une petite économie, mais les petites économies se multiplient.

WonderWorker
la source
2

essaye ça : SELECT CAST(ROUND([Amount 1]/60,2) AS DECIMAL(10,2)) as TOTAL

Quintin moodley
la source
2

En complément des réponses ci-dessous, lorsque vous utilisez des types de données INT ou non décimaux dans vos formules, n'oubliez pas de multiplier la valeur par 1 et le nombre de décimales que vous préférez.

c'est à dire - TotalPackagesest un INTet donc le dénominateurTotalContainers , mais je veux que mon résultat ait jusqu'à 6 décimales.

Donc:

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

L'extrait suivant peut vous aider:

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
la source
0

Je trouve que la fonction STR est le moyen le plus propre d'y parvenir.

SELECT STR(ceiling(123.415432875), 6, 2)
idro2k
la source