Получить полное число, разделив два поля
Я пытался обогнуть некоторые поля. Когда у меня есть 59 дней, я хочу изменить его на 60.
Проблема в том, что когда я использую этот код, 59 меняется на 30, потому что раунд это 1.
select round(1.9666,0)*30, round(59/30,0)*3'
Результатом этого запроса будет 60 для первого поля и 30 для второго. Проблема в том, что когда я попробовал:
select 59/30
Результат равен 1, и мне нужен полный ответ 1.9666...
Как я могу это сделать?
2 ответа
Потому что число, на которое вы делите, является INT
(тип данных с левой стороны не имеет значения), SQL Server вернет INT
как ответ.
Если вы хотите получить число с десятичным знаком в качестве результата, вам нужно разделить на единицу.
Не бросайте FLOAT
поскольку ответ, вероятно, не тот, который вам нужен (значения с плавающей точкой, как правило, не точны и являются "приблизительными"):
SELECT 59 / CAST(30 AS FLOAT) -- = 1.96666666666667
CAST
правая часть деления на DECIMAL
:
SELECT 59 / CAST(30 AS DECIMAL(10, 2)) -- = 1.96666
SELECT cast(59 AS FLOAT) / cast(30 AS FLOAT)
Поскольку исходные цифры являются целыми числами, SQL предполагает, что вы хотите получить целое число.
Чтобы получить один с десятичными разрядами, вам нужно сначала изменить тип данных с целого числа int
в плавающей точке float
,
Это то, что делает команда CAST.
РЕДАКТИРОВАТЬ: Commenter предлагает вам вместо этого бросить DECIMAL. Принцип тот же, но вам нужно предоставить больше аргументов. Чтобы привести к десятичной дроби, используйте что-то вроде:
cast(59 as DECIMAL(18, 3))
Первый аргумент (18) - это общее количество цифр, которое вы хотите разрешить в десятичной дроби. Второй аргумент (3) - это число, которое вы хотите после десятичной точки.
Предположение, что оно более точное, является правильным - как вы увидите, запускаете ли вы инструкции SELECT в этом ответе один за другим. Но в данном конкретном случае это только незначительная разница.