2012-04-22 30 views

Odpowiedz

53
SELECT height/10.0 AS HeightDecimal FROM dbo.whatever; 

Jeśli chcesz konkretnej wagi precyzyjne, a następnie powiedzieć tak:

SELECT CONVERT(DECIMAL(16,4), height/10.0) AS HeightDecimal 
    FROM dbo.whatever; 
+5

+1 dla pierwszej części, ale uważaj na drugi przykład. To 'CONVERT' jest stosowane po podzieleniu i nie może dać ci więcej niż 6 miejsc dziesiętnych, które już posiadasz. –

+0

idealne rozwiązanie !! Sądzę, że pierwsza gra lepiej! prawda? – Diablo

+0

@Diablo Cóż, możesz to przetestować, ale wątpię, byś zauważył jakąkolwiek różnicę. W każdym razie, jeśli potrzebujesz konkretnej precyzji/skali, zrób to formatowanie w warstwie aplikacji. –

17
SELECT CAST(height AS DECIMAL(18,0))/10 

Edit: Jak to działa pod maską?

Typ wyniku jest taki sam jak typ obu argumentów lub, jeśli są różne, jest określany przez data type precedence table. Dlatego możesz rzucić dowolny argument na coś nieintegralnego.

Teraz DECIMAL(18,0) lub równoważnie można napisać tylko DECIMAL, nadal jest rodzajem typu całkowitego, ponieważ domyślna skala 0 oznacza „nie cyfry na prawo od kropki dziesiętnej”. Tak więc rzutowanie na nią może w innych okolicznościach dobrze działać na zaokrąglanie do liczb całkowitych - przeciwieństwo tego, co próbujemy osiągnąć.

Jednak DECIMAL mają własne zasady dotyczące wszystkiego. Na ogół nie są liczbami całkowitymi, ale zawsze dokładnymi numerami. Typ wyniku podziału DECIMAL, który musieliśmy zdarzyć, to is determined specially, aby w naszym przypadku DECIMAL (29,11). Wynik podziału zostanie więc zaokrąglony do 11 miejsc, które nie będą miały wpływu na dzielenie przez 10, ale zaokrąglenie stanie się zauważalne przy dzieleniu przez 3. Możesz kontrolować ilość zaokrąglania, manipulując skalą lewego argumentu. Możesz także zaokrąglić więcej, ale nie mniej, umieszczając kolejną operację ROUND lub CAST wokół całego wyrażenia.

Identyczne mechanika rządzi prostszy i ładniejszy rozwiązanie w akceptowanych odpowiedź:

SELECT height/10.0 

w tym przypadku rodzaj dzielnik jest DECIMAL(3,1) oraz typ wyniku jest DECIMAL(17,6). Spróbuj podzielić przez 3 i obserwuj różnicę w zaokrąglaniu.

Jeśli po prostu nienawidzę całe to gadanie dokładności i skali, i po prostu chcą serwer SQL, aby wykonać wszystkie obliczenia w starej dobrej podwójnej precyzji pływających arytmetyki punktów od pewnego momentu, można wymusić, że zbyt:

SELECT height/CAST(10 AS FLOAT(53)) 

lub równoważnie tylko

SELECT height/CAST (10 AS FLOAT) 
5

można też rzucić Wysokość jako ułamek dziesiętny:

select cast(@height as decimal(10, 5))/10 as heightdecimal 

lub umieścić punkt dziesiętny w swojej wartości jesteś podzielenie przez:

declare @height int 
set @height = 1023 

select @height/10.0 as heightdecimal 

zobaczyć sqlfiddle na przykładzie

2
select cast (height as decimal)/10 as HeightDecimal 
+0

"dziesiętny (cokolwiek, cokolwiek)"? Dlaczego nie określić? –

+0

Masz rację co do podziału, ale może to spowodować problem z przepełnieniem, na przykład dla mnożenia. "dziesiętny (h) * 10" w ogóle nie może być równy "dziesiętnej (g * 10)", myśląc w ten sposób, podniosłem nawyk, aby najpierw rzucić przed operacją. – Dewfy

+3

Zgadzam się na wyraźne oddanie przed operacją jest lepsze. Ale chodzi mi o to, że jeśli chcesz powiedzieć "dziesiętny", powinieneś powiedzieć "dziesiętny (precyzja, skala)". –

Powiązane problemy