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)
+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. –
idealne rozwiązanie !! Sądzę, że pierwsza gra lepiej! prawda? – Diablo
@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. –