2 ondalık basamağa yuvarlama


222

Dakikaları saate dönüştürmeliyim, 2 ondalık basamağa yuvarlandı.Ayrıca ondalık noktadan sonra en fazla 2 sayı görüntülemem gerekiyor. Yani eğer 650 dakikam varsa o zaman saat 10.83 olmalı

Şimdiye kadar sahip olduğum şey:

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

Ama bu durumda, eğer dakikalarım diyelim, 630 - saat 10.5000000. Ama sadece 10.50 olarak istiyorum (yuvarlamadan sonra). Bunu nasıl başarabilirim?


3
Hangi veritabanı motorunu kullanıyorsunuz?
Ja͢ck

Yanıtlar:


378

Sonucunuzu şu şekilde yayınlayamadınız numeric(x,2)mı? Neredex <= 38

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

İadeler

10.500000   10.50

8
Garip. SELECT ROUND(630/60.0, 2);Bana 10.50zaten veriyor .
Ja͢ck

4
@ u07ch Şu anda bir oyuncu kadrosu (round) () kullanmanın amacı nedir?
Ram

16
@Ram Soru sql sunucu motoru belirtmedi - bu yüzden yuvarlak v döküm kendi vurguladı. Sayısal dönüştür, tüm motorlarda yuvarlama yapmaz, bu nedenle hesaplanan sayı 10.809 olsaydı, gerekli soru 10.81 yerine 10.80 elde edersiniz.
u07ch

1
@ u07ch Detaylı cevap için teşekkürler. Bana yardımcı oldu.
Ram

8
cast(630/60.0 as numeric(36,2))yeterli10,50
MrHIDEn

78

SQL Server 2012'de olduğu gibi, yerleşik biçim işlevini kullanabilirsiniz :

SELECT FORMAT(Minutes/60.0, 'N2')

(sadece daha fazla okuma için ...)


2
Bunun binlerce ayırıcı da getirdiğini unutmayın, örneğin1,757.47
8128

10
'N2' yerine '0.00' kullanılması, binlik ayırıcının olmadığı iki ondalık basamak verir.
8128

2
Dizeye dönüştürmek mi istiyorsunuz? hangi sırayla vidalar.
blissweb

2
@blissweb Biçim işlevinin çıktısını değil, orijinal sütunu sipariş edebileceğiniz için sorun olmamalıdır.
Matten



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

2
Stack Overflow'a hoş geldiniz! Sınırlı ve anında yardım sağlayabilecek kod snippet'i için teşekkür ederiz. Düzgün bir açıklama, bunun neden problem için iyi bir çözüm olduğunu açıklayarak uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer soruları olan gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin.
sepehr

4
DECLARE @porcentaje FLOAT

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

SELECT @porcentaje

3

Hem postgresql hem de Oracle ile çalışır

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

3

Aşağıdaki sorgu yararlı ve basittir

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

Çıkışı 0.25 olarak verir.


3

Her ne kadar mezhepte kullanırsanız kullanın ondalık olmalıdır. 1548/100 verecek15.00

Örneğimizde 100ile değiştirirsek ,100.015.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0

3

Numaranızı a NumericveyaDecimal .

Sorgunuzu aşağıdaki ile değiştirin.

SQL Server

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

MySql:

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

CastFonksiyon için bir sarıcı Convertfonksiyonu. SQL'in yorumlanmış bir dil olması ve sonuç, iki fonksiyon aynı sonuçları üretmesine rağmen, fonksiyondaki sahnelerin arkasında biraz daha fazla şey olması Cast. Bu Convertişlevi kullanmak küçük bir tasarruftur, ancak küçük tasarruflar çoğalır.



2

Aşağıdaki yanıtlara bir ek olarak, formüllerinizde INT veya ondalık olmayan veri türleri kullanırken, değeri 1 ve tercih ettiğiniz ondalık sayı ile çarpmayı unutmayın.

yani - TotalPackagesbir INTve paydaTotalContainers , ama sonucumun 6 ondalık basamağa kadar olmasını istiyorum.

Böylece:

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

1

Aşağıdaki kod parçası size yardımcı olabilir:

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

STR fonksiyonunu bunu başarmanın en temiz yolu olarak görüyorum.

SELECT STR(ceiling(123.415432875), 6, 2)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.