Обрізати (не круглі) десяткові знаки в SQL Server


194

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

declare @value decimal(18,2)

set @value = 123.456

Це автоматично круглий @valueбути 123.46, це добре в більшості випадків. Однак для цього проекту мені це не потрібно. Чи є простий спосіб урізання десятків, які мені не потрібні? Я знаю, що можу використовувати left()функцію та перетворювати назад у десятковий. Чи є інші способи?

Відповіді:


188
select round(123.456, 2, 1)

28
Відповідь повинна пояснити, які параметри функції
Тайлер,

9
SQL ROUND (число, десяткові дроби, операція): операція -> Якщо 0, він округляє результат до числа десяткових. Якщо інше значення 0, воно обрізає результат на кількість десяткових знаків. За замовчуванням 0
Midhun Darvin

ви рятувальник життя, у мене була сума, щоб показати лише дві останні цифри "1.9991666", однак вона завжди округляється до 2, незалежно від того, чим я користуюся, за допомогою цього я можу досягти чогось подібного - виберіть FORMAT (круглий (1.9991666) , 2, 1), "N2") ЯК "Ставка", подяка товариша
Павук

269
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. Коли довжина є додатним числом, числовий вираз округляється до числа знаків після коми, визначених довжиною. Коли довжина є від’ємним числом, числовий_вираз округляється в лівій частині десяткової крапки, як визначено довжиною.

  • function Це тип операції, яку потрібно виконати. Функція повинна бути tinyint, smallint або int. Коли функція опущена або має значення 0 (за замовчуванням), числовий_вираз округляється. Якщо вказано значення, відмінне від 0, numeric_expression обрізається.

Хтось знає, яким значенням аргументу функції відповідають tinyint, smallint та int? Microsoft залишила цю частину у своїй документації і не може знайти відповіді ніде. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Дейв

MS SQL SERVER округляє числа дещо інакше, ніж IQ. Для виправлення використовуйте функцію round (x, y, z) на зразок цього раунду (val1 / val2,4,1)
Warren LaFrance


13

Ось як я зміг усікати, а не крутити:

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


10

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

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

Я не розумію цієї відповіді. Наведений SQL призводить до 10.01, що є правильним округленням 10.0055 до двох знаків після коми. Якщо кінцевий параметр не дорівнює 0, значення відсікається (до 2 знаків після коми) до 10.00.
8128

7

Round має необов'язковий параметр

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

3
Вибрати раунд (123.456, 2, 1) буде = 123.450
Бікрам

4
Я не бачу, чому це викликає нагороди. Сказане дасть вам 123.450 та 123.460 відповідно.
remykarem

7

Ви хочете десяткової чи ні?

Якщо ні, використовуйте

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

Якщо ви робите це з 0, тоді зробіть раунд:

select round(@value,2)

1
Вибачте, якщо мені не було зрозуміло, мені потрібно зберігати десяткові знаки, просто скидати ті, які я не хочу. Наприклад, замість 123,456 у моєму прикладі вище перетворюється на 123,46 ... Я хочу скинути третю десяткову частину і зробити її 123,45.
Райан Естабрук

6

Ще один зріз без рішення для округлення та прикладу.

    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

2
+1, для Floor()чого є шлях до децимальних знаків без округлення. Надто поганий Floor () не має другого параметра, який би вказував, у якій позиції. Але я думаю, що * 10) / 10 справді цілком реально працює.
деробій

4

Це видалить десяткову частину будь-якого числа

SELECT ROUND(@val,0,1)

2
Це не. SELECT ROUND (123.4560,0,1) дає замість вас 123,0000.
remykarem

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

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


1

Ще один спосіб - це 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.


1
Скалярна функція ODBC - інша альтернатива!
Арулмуджі

1

Я знаю, що це досить пізно, але я не вважаю це як відповідь, і цей трюк використовую роками.

Просто відніміть .005 від вашої вартості та скористайтеся Round (@ num, 2).

Ваш приклад:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

повертає 123.45

Він автоматично налаштує округлення до потрібного значення, яке ви шукаєте.

До речі, ви відтворюєте програму з фільму Office Space?


0

Будь ласка, спробуйте використати цей код для перетворення 3-х значних знаків після крапки в два десяткових знаки:

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

select @val

Вихід - 123,46


1) 3-й рядок зовсім непотрібний 2) він прямо заявив, що не хоче округляти число, але скорочує його (результат повинен бути 123,45)
Даміян Пабло Гонсалес

0

Я думаю, що вам потрібно лише десяткове значення, в цьому випадку ви можете використовувати наступне:

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

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

0

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

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

0

Я думаю, що ми можемо зробити набагато простіше з більш простим прикладом рішення, знайденим у Hackerrank:

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

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

Рішення вище дає вам уявлення, як просто зробити значення обмеженим 4 знаками після коми. Якщо ви хочете опустити чи верхнє число після десяткових, просто змініть 4 на те, що вам потрібно.



-5
select convert(int,@value)

1
Це не те, чого хотіла ОП. Він все ще хоче десяткових знаків, але хоче видалити їх (truncte), а не округляти їх. IE 123.456 -> 123.45 НЕ 123.456 -> 12.46 і НЕ 123.456 -> 123
Джон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.