SQL - округление до 2 десятичных знаков

222

Мне нужно преобразовать минуты в часы, округленные до 2 знаков после запятой. Мне также нужно отображать только до 2 чисел после запятой. Так что, если у меня есть минуты как 650. Затем часы должны быть 10,83

Вот что у меня так далеко:

Select round(Minutes/60.0,2) from ....

Но в этом случае, если мои минуты, скажем, 630 - это 10.5000000 часов. Но я хочу только 10,50 (после округления). Как мне этого добиться?

user656523
источник
3
Какой движок базы данных вы используете?
Яцк
1
Если T-SQL, это дубликат stackoverflow.com/questions/3190688/…
Сиз Тиммерман,

Ответы:

378

Не могли бы вы представить свой результат как numeric(x,2)? кудаx <= 38

select 
    round(630/60.0,2), 
    cast(round(630/60.0,2) as numeric(36,2))

Возвращает

10.500000   10.50
u07ch
источник
8
Странный. SELECT ROUND(630/60.0, 2);дает мне 10.50уже.
Яцк
4
@ u07ch Какова цель использования round (), когда вы уже используете приведение?
Рам
16
@Ram В вопросе не указан движок сервера sql - поэтому я выделил сам раунд v. Преобразование в числовое не делает округления во всех движках, поэтому, если вычисленное число было 10.809, вы получите 10.80, а не 10.81, требуемый вопрос.
u07ch
1
@ u07ch Спасибо за подробный ответ. это помогло мне.
Рам
8
cast(630/60.0 as numeric(36,2))достаточно10,50
MrHIDEn
78

Как и в SQL Server 2012, вы можете использовать встроенную функцию форматирования :

SELECT FORMAT(Minutes/60.0, 'N2')

(просто для дальнейшего чтения ...)

Интерлакен
источник
2
Обратите внимание, что это также вводит тысячи разделителей, например1,757.47
8128
10
Использование «0,00» вместо «N2» дает два десятичных знака без разделителя тысяч.
8128
2
Кажется, чтобы преобразовать в строку? который портит порядок.
Blissweb
2
@blissweb Не должно быть проблем, поскольку вы можете упорядочить исходный столбец, а не вывод функции Format.
Маттен
25

ты можешь использовать

select cast((630/60.0) as  decimal(16,2))
ОЗУ
источник
13
Declare @number float = 35.44987665;
Select round(@number,2) 
Абхишек Джайсвал
источник
4
Попробуйте добавить немного объяснения к вашему ответу.
Оливье де Мелдер,
3
В случае десятичного числа (10,6), что произойдет?
Ариджит Мукерджи
5
CAST(QuantityLevel AS NUMERIC(18,2))
Шахбаз Раис2
источник
2
Добро пожаловать в стек переполнения! Спасибо за фрагмент кода, который может предоставить некоторую ограниченную, немедленную помощь. Правильное объяснение значительно улучшило бы его долгосрочную ценность , объяснив, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими подобными вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
сентября
4
DECLARE @porcentaje FLOAT

SET @porcentaje = (CONVERT(DECIMAL,ABS(8700)) * 100) / CONVERT(DECIMAL,ABS(37020))

SELECT @porcentaje
Анастасио Вальдес
источник
3

Работает как с postgresql, так и с Oracle

SELECT ename, sal, round(((sal * .15 + comm) /12),2) 
FROM emp where job = 'SALESMAN' 
Манас Мукерджи
источник
3

Следующий запрос полезен и прост

declare @floatExchRate float;
set @floatExchRate=(select convert(decimal(10, 2), 0.2548712))
select  @floatExchRate

Дает вывод как 0.25.

ShaileshDev
источник
3

То, что вы используете в деноминации, должно быть в десятичной дроби, например 1548/100, даст15.00

Если мы заменим 100с 100.0в нашем примере, мы получим15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0
nitin157
источник
3

Преобразуйте ваш номер в NumericилиDecimal .

Замените ваш запрос следующим.

Sql сервер

Select Convert(Numeric(38, 2), Minutes/60.0) from ....

MySql:

Select Convert(Minutes/60.0, Decimal(65, 2)) from ....

CastФункция обертка для Convertфункции. Соедините это с тем, что SQL является интерпретируемым языком, и в результате получается, что хотя две функции дают одинаковые результаты, в этой функции происходит немного больше за кулисами Cast. Использование Convertфункции - это небольшая экономия, но небольшая экономия умножается.

Чудотворец
источник
2

попробуй это : SELECT CAST(ROUND([Amount 1]/60,2) AS DECIMAL(10,2)) as TOTAL

Квинтин Мэнтли
источник
2

В качестве дополнения к ответам ниже, при использовании INT или недесятичных типов данных в ваших формулах, не забудьте умножить значение на 1 и количество десятичных знаков, которые вы предпочитаете.

то есть - TotalPackagesэто INTи так знаменательTotalContainers , но я хочу , чтобы мой результат иметь до 6 знаков после запятой.

таким образом:

((m.TotalPackages * 1.000000) / m.TotalContainers) AS Packages,
Fandango68
источник
1

Следующий фрагмент может помочь вам:

select SUBSTR(ENDDTTM,1, 9), extract(DAY FROM (ENDDTTM)), ENDDTTM, BEGINDTTM,  (ENDDTTM - BEGINDTTM),substr(BEGINDTTM, 1,15), substr((ENDDTTM - BEGINDTTM), 12, 8),
round((substr((ENDDTTM - BEGINDTTM), 12, 2)* 3600 + substr((ENDDTTM - BEGINDTTM), 15, 2)*60 +  substr((ENDDTTM - BEGINDTTM), 18, 2)),2) as seconds,
round((substr((ENDDTTM - BEGINDTTM), 12, 2)* 60 + substr((ENDDTTM - BEGINDTTM), 15, 2) +  substr((ENDDTTM - BEGINDTTM), 18, 2)/60 ), 2)as minutes,
round((substr((ENDDTTM - BEGINDTTM), 12, 2) + substr((ENDDTTM - BEGINDTTM), 15, 2)/60 +  substr((ENDDTTM - BEGINDTTM), 18, 2)/3600 ),2)  as hours
Venkat
источник
0

Я считаю функцию STR самым чистым средством для достижения этой цели.

SELECT STR(ceiling(123.415432875), 6, 2)
idro2k
источник