2015-04-22 5 views
0

У меня есть ситуации, где:SQL Server пользовательских округление

  • 24,9999 должно быть 25
  • 24,5000 должно быть 25
  • 24,4999 должно быть 24
  • 24,1111 должно быть 24

Я пробовал Ceiling, но результат будет 25, где Floor будет 24 для всех из них.

Как это сделать?

Большое спасибо за ваше время.

Примечание: возможно, вам будет полезно сообщить, что я хочу, чтобы эта функциональность находилась внутри computed column.

+0

Вы ищете что-то вроде http://stackoverflow.com/questions/7063962/t-sql-average-rounded-to-the-closest-integer – murtazat

ответ

3

Использование:

Round(YourNumber, 0) 

0 означает точность (т.е. число знаков после запятой); если вы хотите округлить 42,51 до 42,5, вы бы, например, заменили 0 на 1.

Обязательно не используйте float s - они могут иногда быть приблизительными, что иногда вызывает неправильное округление значений.

3

Вы должны использовать round() с 0 в качестве [length] параметра:

round(field, 0) 

SQLFiddle

+0

Большое спасибо, но он не работает на сервере sql. Даже функция раунда имеет 2/3 параметров здесь –

+1

Должно быть 'Round (YourNumber, 0)', чтобы получить то, что вы хотите. – APH

+0

@aphrael OMG .. Спасибо большое, ответьте на мой вопрос, чтобы я мог его принять :) –

1

Только сейчас я смотрел на эту статью:

https://social.technet.microsoft.com/Forums/en-us/01ca0dd6-fe5b-4ec9-9949-ce3608fcebf6/sqlround?forum=sqlservermanagementzhcht

К сожалению, что ISN» t английский, но он сказал:

If you need to use round, try not to use float, use decimal or numeric instead 

Я попытался отливкой поля в десятичном, и она работает, вот скрипка

http://sqlfiddle.com/#!9/3a01fa/4

Вот мой оператор выбора:

select round(cast(smth as decimal)) from tbl 
0

Вы должны использовать круглые (numeric_expression, 4). Длина 4 представляет собой длину точности для десятичных значений. В вашем случае, поскольку десятичные значения имеют длину 4, он будет округлен в соответствии с 4 десятичными значениями.

1

select round(cast(column as decimal)) from tbl будет работать хорошо Но select round(column, 0) from tbl не будет работать, что хорошо, потому что в этом случае 24.5000 приведет к 24, которые должны быть в вашем случае 25.

0

вы можете продолжить как это для предоставления данных

select CAST(CEILING(24.5000)AS INT) 
select CAST(CEILING(24.9999)AS INT) 
select CAST(CEILING(24.1111 -1)AS INT) 
select CAST(CEILING(24.4999 - 1)AS INT) 

Или у вас есть много данных в таблице вас с определенными условиями, то вы можете выбрать десятичные значения после «» точка и написать случай условие accordind в том, что это не способ сделать это, но для достижения результатов

declare @t table (ID decimal(18,4)) 
insert into @t(ID)values (24.5000),(24.9999),(24.1111),(24.4999) 
select case when RIGHT(ID, LEN(ID) - CHARINDEX ('.', ID)) - 1 > 4500 
THEN CAST(CEILING(ID)AS INT) 
ELSE CAST(CEILING(ID - 1)AS INT) END from @t 
Смежные вопросы