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?


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

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


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


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

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

3

Fonctionne à la fois avec postgresql et Oracle

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

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.


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

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.



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,

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

0

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

SELECT STR(ceiling(123.415432875), 6, 2)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.