SQL Server'da ondalık basamakları kısalt (yuvarlak değil)


194

Yuvarlama olmadan SQL'de ondalık basamakları kısaltmak veya bırakmak için en iyi yolu belirlemeye çalışıyorum. Örneğin:

declare @value decimal(18,2)

set @value = 123.456

Bu işlem otomatik olarak yuvarlak olacak @valueolması 123.46çoğu durumda iyi olan. Ancak, bu proje için buna ihtiyacım yok. İhtiyacım olmayan ondalık sayıları kısaltmanın basit bir yolu var mı? left()İşlevi kullanabileceğimi ve ondalık basamağa dönüştürebileceğimi biliyorum . Başka yolu var mı?

Yanıtlar:


188
select round(123.456, 2, 1)

28
Cevap, işlevin parametrelerinin ne olduğunu açıklamalıdır
Tyler

9
SQL YUVARLAK (sayı, ondalık sayılar, işlem): işlem -> 0 ise, sonucu ondalık sayıya yuvarlar. 0'dan başka bir değer olursa, sonucu ondalık sayıya kısaltır. Varsayılan 0
Midhun Darvin

Hayat kurtarıcısın, sadece son iki basamağı göstermek için bir miktarım vardı "1.9991666", ancak ne kullandığım önemli değil, her zaman 2'ye yuvarlandı, bununla böyle bir şey başarabiliyorum - FORMAT (yuvarlak (1.9991666) , 2, 1), 'N2') 'Oran' OLARAK, Teşekkürler dostum
Örümcek

269
ROUND ( 123.456 , 2 , 1 )

Üçüncü parametre ! = 0 olduğunda, mermi yerine kesilir

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Sözdizimi

ROUND ( numeric_expression , length [ ,function ] )

Argümanlar

  • numeric_expression Bit veri türü hariç, tam sayısal veya yaklaşık sayısal veri türü kategorisinin bir ifadesidir.

  • length Numeric_expression öğesinin yuvarlanacağı hassasiyettir. uzunluk, tinyint, smallint veya int türünde bir ifade olmalıdır. Uzunluk pozitif bir sayı olduğunda, sayısal_ifade, uzunluk ile belirtilen ondalık konum sayısına yuvarlanır. Uzunluk negatif bir sayı olduğunda, sayısal olarak ifade, uzunlukla belirtildiği gibi ondalık noktanın sol tarafında yuvarlanır.

  • function Gerçekleştirilecek işlem türüdür. işlevi tinyint, smallint veya int olmalıdır. İşlev atlandığında veya 0 (varsayılan) değerine sahip olduğunda, sayısal_ifade yuvarlanır. 0 dışında bir değer belirtildiğinde, sayısal_ifade kesilir.

İşlev argümanı için hangi değerlerin tinyint, smallint ve int'e karşılık geldiğini bilen var mı? Microsoft bu bölümü belgelerinin dışında bıraktı ve yanıtı hiçbir yerde bulamadı. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Dave

MS SQL SERVER, sayıları IQ'dan biraz farklı yuvarlar. Düzeltmek için bu tur gibi yuvarlak (x, y, z) fonksiyonunu kullanın (val1 / val2,4,1)
Warren LaFrance


13

İşte yuvarlak değil, kısaltabildim:

select 100.0019-(100.0019%.001)

100.0010 döndürür

Ve örneğiniz:

select 123.456-(123.456%.001)

123.450 döndürür

Eğer son sıfırdan kurtulmak istiyorsanız, sadece dökün:

select cast((123.456-(123.456%.001)) as decimal (18,2))

123,45 döndürür


10

Aslında üçüncü parametre ne olursa olsun, 0 veya 1 veya 2, değerinizi yuvarlamaz.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

Bu cevabı anlamıyorum. Verilen SQL, 10.01 ile sonuçlanır; bu, 10.0055 değerinin iki ondalık basamağa doğru yuvarlanmasıdır. Son parametre 0 değilse, değer 10.00'a (2 ondalık basamağa) kesilir.
8128

7

Turun isteğe bağlı bir parametresi vardır

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

3
Seçme turu (123.456, 2, 1) = 123.450
Bikram

4
Bunun neden yükseldiğini anlamıyorum. Yukarıda sırasıyla 123.450 ve 123.460 verilecektir.
remykarem

7

Ondalık ister misiniz?

Değilse, kullanın

select ceiling(@value),floor(@value)

0 ile yaparsanız, bir tur yapın:

select round(@value,2)

1
Üzgünüm, açık olmasaydım, ondalık basamakları saklamam gerekiyor, sadece istemediğimi bırak. Örneğin, yukarıdaki örnekte 123.456 yerine 123.46'ya dönüştürülüyor ... Üçüncü ondalık sayıyı bırakmak ve 123.45 yapmak istiyorum.
Ryan Eastabrook

6

Yuvarlama çözümü ve örneği olmayan başka bir kesik.

    Convert 71.950005666 to a single decimal place number (71.9)
    1) 71.950005666 * 10.0 = 719.50005666
    2) Floor(719.50005666) = 719.0
    3) 719.0 / 10.0 = 71.9

    select Floor(71.950005666 * 10.0) / 10.0

2
+1 Floor()ondalık sayıları yuvarlamadan düşürmenin yolu budur. Çok kötü Floor () öğesinin hangi konumda olduğunu gösteren ikinci bir parametresi yoktur. Ama bence * 10) / 10 oldukça iyi çalışıyor.
deroby

4

Bu, herhangi bir sayının ondalık kısmını kaldıracaktır

SELECT ROUND(@val,0,1)

2
O değil. SELECT ROUND (123.4560,0,1) bunun yerine 123.0000 verir.
remykarem

2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

Ondalık noktadan sonra size 2 değer verir. (MS SQL SUNUCUSU)


1

Başka bir yol ODBC TRUNCATEişlevdir:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

Çıktı:

╔═════════╦═════════╗
   val    result  
╠═════════╬═════════╣
 123,456  123,450 
╚═════════╩═════════╝

remark:

ROUND3. parametre 1'e ayarlanmış olarak yerleşik işlev kullanmanızı öneririm .


1
ODBC Skaler Fonksiyon - Farklı Alternatif!
Arulmouzhi

1

Bunun çok geç olduğunu biliyorum ama bir cevap olarak görmüyorum ve bu hileyi yıllardır kullanıyorum.

Sadece değerinizden .005 çıkarın ve Round (@ num, 2) kullanın.

Örneğiniz:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

123,45 döndürür

Yuvarlamayı otomatik olarak aradığınız doğru değere ayarlar.

Bu arada, programı Office Space filminden mi yeniden oluşturuyorsunuz?


0

Lütfen bir noktadan sonra 3 ondalık değeri 2 ondalık basamağa dönüştürmek için bu kodu kullanmaya çalışın:

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

Çıktı 123,46


1) 3. satır tamamen gereksiz 2) açıkça sayıyı yuvarlamak istemediğini söyledi, ancak kısalt (sonuç 123.45 olmalı)
Damián Pablo González

0

Sadece ondalık değeri istediğinizi düşünüyorum, bu durumda aşağıdakileri kullanabilirsiniz:

declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)

0

Bu sorunun gerçekten eski olduğunu biliyorum ama kimse yuvarlamak için alt dizeleri kullanmamıştı. Bu, gerçekten uzun sayıları (genellikle 8000 karakterden oluşan SQL sunucusunda dizenizin sınırı) yuvarlama avantajıdır:

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

Hackerrank'ta bulunan daha basit örnek çözümle çok daha kolay gidebileceğimizi düşünüyorum:

Sorun bildirimi: Kuzey Enlemlerinin (LAT_N) en yüksek değerini 137.2345'ten küçük olan STATION'dan sorgulayın. Cevabınızı 4 ondalık basamağa kadar kesin.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

Yukarıdaki Çözüm, değeri 4 ondalık basamakla sınırlı hale getirme fikrini verir. Ondalıktan sonra sayıları düşürmek veya küçültmek istiyorsanız, 4'ü istediğiniz gibi değiştirin.



-5
select convert(int,@value)

1
OP'nin istediği bu değildi. Hala ondalık basamak istiyor, ancak onları yuvarlamak yerine kaldırmak istiyor. IE 123.456 -> 123.45 NOT 123.456 -> 12.46 ve DEĞİL 123.456 -> 123
John
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.