SQL - Zaokrąglanie do 2 miejsc po przecinku

222

Muszę przeliczyć minuty na godziny, w zaokrągleniu do 2 miejsc po przecinku. Muszę też wyświetlać tylko do 2 liczb po przecinku. Więc jeśli mam minuty jak 650, to godziny powinny wynosić 10,83

Oto co mam do tej pory:

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

Ale w tym przypadku, jeśli moje minuty to, powiedzmy, 630 godzin, to 10.5000000. Ale chcę tylko 10,50 (po zaokrągleniu). Jak to osiągnąć?

użytkownik656523
źródło
3
Z jakiego silnika bazy danych korzystasz?
Ja͢ck
1
W przypadku T-SQL jest to duplikat stackoverflow.com/questions/3190688/...
Cees Timmerman

Odpowiedzi:

378

Czy nie możesz rzucić swojego wyniku jako numeric(x,2)? Gdziex <= 38

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

Zwroty

10.500000   10.50
u07ch
źródło
8
Dziwne. już SELECT ROUND(630/60.0, 2);mi daje 10.50.
Ja͢ck
4
@ u07ch jaki jest cel używania round (), kiedy już używasz obsady?
Ram
16
@Ram Pytanie nie określało silnika serwera SQL - dlatego sam podświetliłem rundę v cast. Konwersja na liczbę nie powoduje zaokrąglania we wszystkich silnikach, więc jeśli obliczona liczba to 10.809, dostaniesz 10.80 zamiast 10.81, to pytanie będzie wymagane.
u07ch
1
@ u07ch Dzięki za szczegółową odpowiedź. pomogło mi.
Ram
8
cast(630/60.0 as numeric(36,2))jest 10,50
gotowy
78

Podobnie jak w SQL Server 2012, możesz użyć wbudowanej funkcji formatowania :

SELECT FORMAT(Minutes/60.0, 'N2')

(tylko dla dalszych odczytów ...)

Matten
źródło
2
Zauważ, że wprowadza to również tysiące separatorów, np.1,757.47
8128
10
Użycie „0,00” zamiast „N2” daje dwa miejsca po przecinku bez separatora tysięcy.
8128
2
Wydaje się konwertować na ciąg? przez co psuje zamówienie.
blissweb,
2
@blissweb Nie powinno stanowić problemu, ponieważ można zamówić w oryginalnej kolumnie, a nie w wynikach funkcji Format.
Matten
25

możesz użyć

select cast((630/60.0) as  decimal(16,2))
Baran
źródło
13
Declare @number float = 35.44987665;
Select round(@number,2) 
Abhishek Jaiswal
źródło
4
Zastanów się nad dodaniem wyjaśnienia do swojej odpowiedzi.
Olivier De Meulder
3
Co się stanie w przypadku po przecinku (10,6)?
Arijit Mukherjee
5
CAST(QuantityLevel AS NUMERIC(18,2))
Shahbaz Raees2
źródło
2
Witamy w Stack Overflow! Dziękujemy za fragment kodu, który może zapewnić ograniczoną, natychmiastową pomoc. Właściwe wyjaśnienie znacznie poprawiłoby jego długoterminową wartość , opisując, dlaczego jest to dobre rozwiązanie problemu i uczyniłoby to bardziej użytecznym dla przyszłych czytelników z innymi podobnymi pytaniami. Edytuj swoją odpowiedź, aby dodać wyjaśnienie, w tym przyjęte założenia.
wrzesień
4
DECLARE @porcentaje FLOAT

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

SELECT @porcentaje
Anastacio Valdez
źródło
3

Działa zarówno z Postgresql i Oracle

SELECT ename, sal, round(((sal * .15 + comm) /12),2) 
FROM emp where job = 'SALESMAN' 
manas mukherjee
źródło
3

Poniższe zapytanie jest przydatne i proste-

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

Daje wynik jako 0,25.

ShaileshDev
źródło
3

Cokolwiek użyjesz w nominale, powinno być w systemie dziesiętnym, na przykład 1548/100da15.00

Jeśli zastąpimy 100ze 100.0w naszym przykładzie będziemy mieli15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0
nitin157
źródło
3

Konwertuj swój numer na a NumericlubDecimal .

Zamień zapytanie na następujące.

Serwer SQL

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

MySql:

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

CastFunkcja jest owijką dla Convertfunkcji. Połączmy to z SQL, który jest językiem interpretowanym, a wynikiem tego jest to, że chociaż obie funkcje dają takie same wyniki, nieco więcej dzieje się za kulisami Castfunkcji. Korzystanie z tej Convertfunkcji to niewielka oszczędność, ale niewielka oszczędność pomnaża się.

WonderWorker
źródło
2

Spróbuj tego : SELECT CAST(ROUND([Amount 1]/60,2) AS DECIMAL(10,2)) as TOTAL

Quintin moodley
źródło
2

Jako dodatek do poniższych odpowiedzi, używając INT lub non-dziesiętnych typów danych w formułach, pamiętaj, aby pomnożyć wartość przez 1 i liczbę miejsc po przecinku, które wolisz.

tzn. - TotalPackagesjest INTmianownikiem i tak TotalContainers, ale chcę, aby mój wynik miał do 6 miejsc po przecinku.

a zatem:

((m.TotalPackages * 1.000000) / m.TotalContainers) AS Packages,
Fandango68
źródło
1

Poniższy fragment kodu może ci pomóc:

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
źródło
0

Uważam, że funkcja STR jest najczystszym sposobem na osiągnięcie tego.

SELECT STR(ceiling(123.415432875), 6, 2)
idro2k
źródło