2012-04-22 2 views
32

Столбец height является целым типом в моей таблице SQL Server. Я хочу, чтобы сделать разделение и есть результат в виде десятичной дроби в мой запрос:Как преобразовать целое число в десятичное в запросе SQL Server?

Select (height/10) as HeightDecimal 

Как бросить так, чтобы HeightDecimal больше не целое число? Благодарю.

ответ

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

Если вы хотите конкретный точный масштаб, то скажем так:

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

+1 для первой части, но остерегайтесь второго примера. Этот «CONVERT» применяется после разделения и не может дать вам больше шести десятичных знаков, которые у вас уже есть. –

+0

идеальное решение !! Наверное, сначала лучше получается! не так ли? – Diablo

+0

@ Diablo Ну, вы можете проверить это, но я сомневаюсь, что вы заметите какую-либо разницу. В любом случае, если вам нужна конкретная точность/масштаб, сделайте это форматирование на своем прикладном уровне. –

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

Edit: Как это работает под капотом?

Тип результата совпадает с типом обоих аргументов или, если они отличаются, определяется data type precedence table. Поэтому вы можете использовать любой аргумент для чего-то нецелого.

Теперь DECIMAL(18,0), или вы могли бы написать что то же самое только DECIMAL, до сих пор вид целого типа, потому что по умолчанию масштаб 0 означает «нет цифр справа от десятичной точки». Таким образом, приведение к нему может в разных обстоятельствах хорошо работать для округления до целых чисел - противоположность тому, что мы пытаемся выполнить.

Однако у DECIMAL есть свои правила для всего. Они, как правило, нецелые, но всегда точные числа. Тип результата деления DECIMAL, который мы заставили произойти, is determined specially быть, в нашем случае, DECIMAL (29,11). Следовательно, результат разделения будет округлен до 11 мест, что не связано с делением на 10, но округление становится наблюдаемым при делении на 3. Вы можете контролировать количество округления, манипулируя шкалой левого операнда. Вы можете также округлить больше, но не меньше, разместив еще одну операцию ROUND или CAST вокруг всего выражения.

Идентичные механика управляет проще и приятнее решение в принятом ответе:

SELECT height/10.0 

В этом случае тип делителя DECIMAL(3,1) и тип результата DECIMAL(17,6). Попробуйте делить на 3 и наблюдать разницу в округлении.

Если вы просто ненавидите все эти разговоры о точностях и масштабах, и просто хотите SQL-сервер для выполнения всех вычислений в старой доброй двойной точности с плавающей точкой арифметики от некоторой точки, вы можете заставить это тоже:

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

или что то же самое только

SELECT height/CAST (10 AS FLOAT) 
5

Вы можете либо бросить Высота как десятичное:

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

или поместить десятичную точку в своем значении вы разделив на:

declare @height int 
set @height = 1023 

select @height/10.0 as heightdecimal 

см sqlfiddle с примером

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

'десятичный (ничего, ничего)'? Почему бы не указать? –

+0

Вы правы в отношении деления, но можете создать проблему переполнения, например, для умножения. 'decimal (h) * 10' вообще не может быть равным' decimal (g * 10) ', думая таким образом, что я поднял привычку бросать перед операцией – Dewfy

+3

Я соглашаюсь на явное литье перед операциями лучше. Но я хотел сказать, что если вы скажете 'decimal', вы должны сказать' decimal (точность, масштаб) '. –