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?


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

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


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


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

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

3

Funktioniert sowohl mit postgresql als auch mit Oracle

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

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.


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

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.



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,

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

0

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

SELECT STR(ceiling(123.415432875), 6, 2)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.