SQL - Membulatkan ke 2 tempat desimal

222

Saya perlu mengkonversi menit ke jam, dibulatkan ke 2 tempat desimal. Saya juga perlu menampilkan hanya hingga 2 angka setelah titik desimal. Jadi jika saya punya menit 650. Lalu jam harus 10,83

Inilah yang saya miliki sejauh ini:

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

Tetapi dalam kasus ini, jika risalah saya, katakanlah, 630 - jam adalah 10.5000000. Tapi saya ingin hanya 10,50 (setelah pembulatan). Bagaimana saya mencapai ini?

pengguna656523
sumber
3
Mesin basis data apa yang Anda gunakan?
Ja͢ck
1
Jika T-SQL, ini adalah duplikat dari stackoverflow.com/questions/3190688/...
Cees Timmerman

Jawaban:

378

Bisakah Anda tidak memberikan hasil sebagai numeric(x,2)? Dimanax <= 38

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

Kembali

10.500000   10.50
u07ch
sumber
8
Aneh. SELECT ROUND(630/60.0, 2);sudah memberi saya 10.50.
Ja͢ck
4
@ u07ch apa tujuan menggunakan round () ketika Anda sudah menggunakan gips?
Ram
16
@ Ray Pertanyaannya tidak menentukan mesin server sql - itulah sebabnya saya menyoroti putaran v casting sendiri. Konversi ke numerik tidak melakukan pembulatan di semua mesin jadi jika angka yang dihitung adalah 10.809 Anda akan mendapatkan 10.80 daripada 10.81 pertanyaan yang diperlukan.
u07ch
1
@ u07ch Terima kasih atas balasan terperinci. itu membantu saya.
Ram
8
cast(630/60.0 as numeric(36,2))is enougth10,50
MrHIDEn
78

Seperti dengan SQL Server 2012, Anda dapat menggunakan fungsi format bawaan :

SELECT FORMAT(Minutes/60.0, 'N2')

(hanya untuk bacaan lebih lanjut ...)

Matten
sumber
2
Perhatikan bahwa ini juga memperkenalkan ribuan pemisah, misalnya1,757.47
8128
10
Menggunakan '0,00' daripada 'N2' memberikan dua tempat desimal tanpa juga memiliki pemisah ribuan.
8128
2
Tampaknya akan dikonversi ke string? yang mengacaukan pesanan.
blissweb
2
@blissweb Seharusnya tidak menjadi masalah karena Anda dapat memesan pada kolom asli, bukan output dari fungsi Format.
Matten
25

kamu bisa memakai

select cast((630/60.0) as  decimal(16,2))
Ram
sumber
13
Declare @number float = 35.44987665;
Select round(@number,2) 
Abhishek Jaiswal
sumber
4
Pertimbangkan untuk menambahkan sedikit penjelasan pada jawaban Anda.
Olivier De Meulder
3
Dalam kasus desimal (10,6) apa yang akan terjadi?
Arijit Mukherjee
5
CAST(QuantityLevel AS NUMERIC(18,2))
Shahbaz Raees2
sumber
2
Selamat Datang di Stack Overflow! Terima kasih atas cuplikan kode, yang mungkin memberikan bantuan terbatas dan segera. Penjelasan yang tepat akan sangat meningkatkan nilai jangka panjangnya dengan menjelaskan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan serupa lainnya. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
sepehr
4
DECLARE @porcentaje FLOAT

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

SELECT @porcentaje
Anastacio Valdez
sumber
3

Bekerja dengan postgresql dan Oracle

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

Permintaan berikut berguna dan sederhana-

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

Memberikan output sebagai 0,25.

ShaileshDev
sumber
3

Misalnya, apa yang Anda gunakan dalam denominasi harus dalam bentuk desimal 1548/100 akan memberi15.00

Jika kita ganti 100dengan 100.0dalam contoh kita, kita akan dapatkan15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0
nitin157
sumber
3

Ubah nomor Anda menjadi a NumericatauDecimal .

Ganti kueri Anda dengan yang berikut ini.

Sql server

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

MySql:

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

The Castfungsi pembungkus untuk Convertfungsi. Berpasangan dengan SQL sebagai bahasa yang ditafsirkan dan hasilnya adalah bahwa meskipun kedua fungsi menghasilkan hasil yang sama, ada sedikit lebih banyak terjadi di belakang layar dalam Castfungsi tersebut. Menggunakan Convertfungsi ini adalah penghematan kecil, tetapi penghematan kecil berlipat ganda.

WonderWorker
sumber
2

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

Quintin moodley
sumber
2

Sebagai tambahan untuk jawaban di bawah ini, saat menggunakan INT atau tipe data non-desimal dalam rumus Anda, ingatlah untuk mengalikan nilainya dengan 1 dan jumlah desimal yang Anda inginkan.

yaitu - TotalPackagesadalah INTdan jadi penyebutnya TotalContainers, tetapi saya ingin hasil saya memiliki hingga 6 angka desimal.

jadi:

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

Cuplikan berikut mungkin membantu Anda:

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

Saya menemukan fungsi STR cara terbersih untuk mencapai ini.

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