Получить полное число, разделив два поля

Я пытался обогнуть некоторые поля. Когда у меня есть 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 в этом ответе один за другим. Но в данном конкретном случае это только незначительная разница.

Другие вопросы по тегам