Можно ли легко округлить фигуру вверх до ближайших 100 (или 1000, 500, 200 и т.д.) в SQL Server?
Итак:
720 → 800
790 → 800
1401 → 1500
Можно ли легко округлить фигуру вверх до ближайших 100 (или 1000, 500, 200 и т.д.) в SQL Server?
Итак:
720 → 800
790 → 800
1401 → 1500
Следующее должно работать. После прочтения вашего вопроса я не совсем уверен, что вы хотите вернуть. Для этого 100 возвращает 100.
select floor((X + 99) / 100) * 100;
Это дает следующие результаты:
0 -> 0
1 -> 100
99 -> 100
100 -> 100
101 -> 200
Для округления До ближайшей тысячи, попробуйте следующее: -
select round(YourValue, -3)
Ура!!!!!
Один из вариантов заключается в использовании функции CEILING():
SELECT CEILING(@value/100.0) * 100
Вам может потребоваться преобразовать ваше значение в десятичную в начале в зависимости от его типа.
Используйте функцию ПОТОЛКА для округления фигуры вверх
DECLARE @Number DECIMAL, @RoundUp DECIMAL
SET @RoundUp = 100
SET @Number = 720
SELECT CEILING(@Number/@RoundUp)*@RoundUp
Попробуйте следующее:
выберите round (@value, -2);
Там нет встроенной функции, которая будет делать это, но есть множество простых математических приемов, которые будут. Пример:
DECLARE @Foo int
SET @Foo = 720
print @Foo
print (@Foo + 100) % 100
PRINT @Foo - (@Foo + 100) % 100
Вы можете использовать этот код, если ваш amount
является int. Если нет, вам нужно будет выполнить бросок, чтобы получить целочисленное деление.
If amount % 100 != 0 Then
roundedAmount = ((amount / 100) * 100) + 100
Else
roundedAmount = amount
Возможно, вы захотите упаковать его в пользовательскую функцию.
Общее решение. Используйте MOD, чтобы найти последнее 100-е место, а затем добавьте 100 к результату.
select (720 - MOD(720,100)) + 100 from dual;
Если вам нужно следующее 80-е место, просто замените "100" на "80".
Очень просто округлить число до любого кратного ближайшего 10, просто используя функцию ROUND
для ex:
SELECT ROUND(number/1000,2)*1000
Это даст вам ближайшее тысячное значение.
В дополнение к ответу Серый, Я бы использовал следующую встроенную функцию:
CREATE FUNCTION dbo.udf_RoundNearest
(
@Number bigint,
@RoundNearest bigint,
@Direction int
)
RETURNS TABLE AS
RETURN
SELECT CASE WHEN @RoundNearest>[email protected] THEN @Number
ELSE
(
(@Number + CASE
WHEN @Direction = 0 --Round Down
THEN 0
ELSE CASE WHEN @Number % @RoundNearest = 0 THEN 0 ELSE @RoundNearest END
END) / @RoundNearest) * @RoundNearest
END Number
Определение параметра:
с помощью функции:
SELECT * FROM dbo.udf_RoundNearest (1965,100,1) --> 2000
SELECT * FROM dbo.udf_RoundNearest (1359,100,0) --> 1300
SELECT * FROM dbo.udf_RoundNearest (1999,10,0) --1990
SELECT * FROM dbo.udf_RoundNearest (80,100,0) --> 80 (if the @number parameter is less or equal the @RoundNearest parameter the result will be the @number itself
он также может использоваться как применимый к таблице например:
;with tmp (Value) as
(select 1236 union all select 6584 union all select 9999)
select t.*, fn.Number
from tmp t
cross apply dbo.udf_RoundNearest (Value,100,0) fn
/*Result Set
Value Number
1236 1200
6584 6500
9999 9900*/