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?


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

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


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


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

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

3

Bekerja dengan postgresql dan Oracle

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

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.


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

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.



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,

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

0

Saya menemukan fungsi STR cara terbersih untuk mencapai ini.

SELECT STR(ceiling(123.415432875), 6, 2)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.