Усекать (не округлые) десятичные разряды в SQL Server

Я пытаюсь определить лучший способ обрезать или отбрасывать лишние десятичные разряды в SQL без округления. Например:

declare @value decimal(18,2)

set @value = 123.456

Это автоматически @value до 123.46, что хорошо в большинстве случаев. Однако для этого проекта мне это не нужно. Есть ли простой способ обрезать десятичные дроби, которые мне не нужны? Я знаю, что могу использовать функцию left() и конвертировать обратно в десятичную. Есть ли другие способы?

Ответ 1

select round(123.456, 2, 1)

Ответ 2

ROUND ( 123.456 , 2 , 1 )

Когда третий параметр ! = 0 он усекает, а не округляет

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Синтаксис

ROUND ( numeric_expression , length [ ,function ] )

Аргументы

  • numeric_expression Выражение точных числовых или приблизительных числовых данных категория типа, за исключением битового типа данных.

  • length Точность, до которой округляется числовое выражение. длина должна быть выражением типа tinyint, smallint или int. Когда длина является положительным числом, numeric_expression округляется до количества десятичных разрядов, указанных в length. Если длина - отрицательное число, выражение numeric_expression округляется в левой части десятичной точки, как указано в length.

  • function Тип операции для выполнения. функция должна быть tinyint, smallint или int. Когда функция опущена или имеет значение 0 (по умолчанию), числовое выражение округляется. Если указано значение, отличное от 0, выражение numeric_expression усекается.

Ответ 3

SELECT Cast(Round(123.456,2,1) as decimal(18,2))

Ответ 4

Вот как я смог усечь, а не раунд:

select 100.0019-(100.0019%.001)

возвращает 100.0010

И ваш пример:

select 123.456-(123.456%.001)

возвращает 123.450

Теперь, если вы хотите избавиться от нулевого нуля, просто нажмите его:

select cast((123.456-(123.456%.001)) as decimal (18,2))

возвращает 123.45

Ответ 5

Фактически независимо от третьего параметра, 0 или 1 или 2, он не будет округлять ваше значение.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

Ответ 6

Round имеет необязательный параметр

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

Ответ 7

Вы хотите десятичное или нет?

Если нет, используйте

select ceiling(@value),floor(@value)

Если вы сделаете это с помощью 0, выполните раунд:

select round(@value,2)

Ответ 8

Другое усечение без решения округления и примера.

    Convert 71.950005666 to a single decimal place number (71.9)
    1) 71.950005666 * 10.0 = 719.50005666
    2) Floor(719.50005666) = 719.0
    3) 719.0 / 10.0 = 71.9

    select Floor(71.950005666 * 10.0) / 10.0

Ответ 9

Это приведет к удалению десятичной части любого числа

SELECT ROUND(@val,0,1)

Ответ 10

Я знаю, что это довольно поздно, но я не вижу в этом ответа и много лет использую этот трюк.

Просто вычитайте .005 из своего значения и используйте Round (@num, 2).

Ваш пример:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

возвращает 123.45

Он автоматически настроит округление на нужное значение, которое вы ищете.

Кстати, воссоздаете ли вы программу из окна Office Space?

Ответ 11

Попробуйте использовать этот код для преобразования 3 десятичных значений после точки в 2 десятичных знака:

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

Вывод 123.46

Ответ 12

Я думаю, вы хотите только десятичное значение, в этом случае вы можете использовать следующее:

declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)

Ответ 13

Другим способом является ODBC TRUNCATE:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

Вывод:

╔═════════╦═════════╗
║   val   ║ result  ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝

Примечание:

Я рекомендую использовать встроенную функцию ROUND с 3-м параметром, установленным в 1.

Ответ 14

Я знаю, что этот вопрос действительно старый, но никто не использовал подстроки для округления. Это как преимущество возможности округлять действительно длинные числа (предел вашей строки на сервере SQL, который обычно составляет 8000 символов):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

Ответ 15

Я думаю, что мы можем пойти намного проще с помощью простого примера решения, найденного в Hackerrank:

Постановка проблемы: запросите наибольшую ценность северных широт (LAT_N) от STATION, который меньше 137,2345. Усекни свой ответ до 4 знаков после запятой.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

Решение выше дает вам представление о том, как просто сделать значение ограниченным 4 десятичными знаками. Если вы хотите уменьшить или увеличить цифры после десятичной дроби, просто измените 4 на любое другое.

Ответ 16

SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

Даст вам 2 значения после десятичной точки. (MS SQL SERVER)

Ответ 17

Mod(x,1) - самый простой способ, я думаю.

Ответ 18

select convert(int,@value)