SQL - Abrundung auf 2 Dezimalstellen

222

Ich muss Minuten in Stunden umrechnen, auf 2 Dezimalstellen gerundet. Außerdem muss ich nur bis zu 2 Zahlen nach dem Dezimalpunkt anzeigen. Also, wenn ich Minuten als 650 habe. Dann sollten die Stunden 10,83 sein

Folgendes habe ich bisher:

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

Aber in diesem Fall, wenn meine Minuten beispielsweise 630 - Stunden sind, ist 10.5000000. Aber ich möchte es nur als 10.50 (nach dem Runden). Wie erreiche ich das?

user656523
quelle
3
Welches Datenbankmodul verwenden Sie?
Ja͢ck
1
Wenn T-SQL, ist dies ein Duplikat von stackoverflow.com/questions/3190688/…
Cees Timmerman

Antworten:

378

Könnten Sie Ihr Ergebnis nicht als numeric(x,2)? Wox <= 38

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

Kehrt zurück

10.500000   10.50
u07ch
quelle
8
Seltsam. SELECT ROUND(630/60.0, 2);gibt mir 10.50schon
Ja͢ck
4
@ u07ch Was ist der Zweck von round (), wenn Sie bereits eine Besetzung verwenden?
Ram
16
@Ram In der Frage wurde die SQL Server-Engine nicht angegeben. Deshalb habe ich die Round-V-Besetzung selbst hervorgehoben. Die Konvertierung in numerische Werte rundet nicht in allen Engines ab. Wenn die berechnete Zahl also 10,809 wäre, würden Sie 10,80 anstelle der erforderlichen 10,81 erhalten.
U07ch
1
@ u07ch Danke für die ausführliche Antwort. Es hat mir geholfen.
Ram
8
cast(630/60.0 as numeric(36,2))ist genug10,50
MrHIDEn
78

Wie bei SQL Server 2012 können Sie die integrierte Formatfunktion verwenden :

SELECT FORMAT(Minutes/60.0, 'N2')

(nur für weitere Lesungen ...)

Matten
quelle
2
Beachten Sie, dass dies auch Tausende Trennzeichen einführt, z. B.1,757.47
8128
10
Die Verwendung von '0.00' anstelle von 'N2' ergibt zwei Dezimalstellen, ohne dass auch das Tausendertrennzeichen vorhanden ist.
8128
2
Scheint in String zu konvertieren? was vermasselt um.
Blissweb
2
@blissweb Sollte kein Problem sein, da Sie in der ursprünglichen Spalte bestellen können, nicht in der Ausgabe der Format-Funktion.
Matten
25

Sie können verwenden

select cast((630/60.0) as  decimal(16,2))
RAM
quelle
13
Declare @number float = 35.44987665;
Select round(@number,2) 
Abhishek Jaiswal
quelle
4
Erwägen Sie, Ihrer Antwort eine Erklärung hinzuzufügen.
Olivier De Meulder
3
Was passiert bei Dezimalstellen (10,6)?
Arijit Mukherjee
5
CAST(QuantityLevel AS NUMERIC(18,2))
Shahbaz Raees2
quelle
2
Willkommen bei Stack Overflow! Vielen Dank für das Code-Snippet, das möglicherweise nur begrenzte, sofortige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie beschreibt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
September
4
DECLARE @porcentaje FLOAT

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

SELECT @porcentaje
Anastacio Valdez
quelle
3

Funktioniert sowohl mit postgresql als auch mit Oracle

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

Die folgende Abfrage ist nützlich und einfach.

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

Gibt die Ausgabe als 0,25 aus.

ShaileshDev
quelle
3

Was auch immer Sie in Stückelung verwenden in dezimal sein soll, zum Beispiel 1548/100geben15.00

Wenn wir ersetzen 100mit 100.0in unserem Beispiel die wir bekommen15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0
nitin157
quelle
3

Konvertieren Sie Ihre Nummer in ein Numericoder Decimal.

Ersetzen Sie Ihre Anfrage durch Folgendes.

SQL Server

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

MySql:

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

Die CastFunktion ist ein Wrapper für die ConvertFunktion. Wenn SQL eine interpretierte Sprache ist und das Ergebnis ist, dass hinter den Kulissen der CastFunktion etwas mehr passiert, obwohl die beiden Funktionen dieselben Ergebnisse liefern . Die Verwendung der ConvertFunktion ist eine kleine Einsparung, aber kleine Einsparungen multiplizieren sich.

WonderWorker
quelle
2

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

Quintin Moodley
quelle
2

Denken Sie als Ergänzung zu den folgenden Antworten daran, den Wert mit 1 und der Anzahl der von Ihnen bevorzugten Dezimalstellen zu multiplizieren, wenn Sie INT- oder nicht dezimale Datentypen in Ihren Formeln verwenden.

dh - TotalPackagesist ein INTund damit der Nenner TotalContainers, aber ich möchte, dass mein Ergebnis bis zu 6 Dezimalstellen hat.

so:

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

Das folgende Snippet könnte Ihnen helfen:

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

Ich finde die STR-Funktion das sauberste Mittel, um dies zu erreichen.

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