SQL - округлення до 2 знаків після коми


222

Мені потрібно конвертувати хвилини в години, округлені до 2 знаків після коми. Мені також потрібно відображати лише до 2 цифр після десяткової крапки. Тож якщо у мене хвилин як 650. Тоді годин повинно бути 10,83

Ось що я маю досі:

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

Але в цьому випадку, якщо моїх хвилин, скажімо, 630 - годин - це 10,5000000. Але я хочу, щоб це був лише 10.50 (після округлення). Як я цього досягти?


3
Який двигун бази даних ви використовуєте?
Ja͢ck

1
Якщо T-SQL, це дублікат stackoverflow.com/questions/3190688/…
Cees Timmerman

Відповіді:


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

8
Дивно. SELECT ROUND(630/60.0, 2);мене 10.50вже дає .
Ja͢ck

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))є enougth10,50
MrHIDEn

78

Як і у SQL Server 2012, ви можете використовувати вбудовану функцію форматування :

SELECT FORMAT(Minutes/60.0, 'N2')

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


2
Зауважте, що це також вводить тисячі розділювачів, наприклад1,757.47
8128

10
Використання "0,00", а не "N2", дає два знаки після коми, не маючи роздільника тисяч.
8128

2
Здається, перетворити на рядок? який накручує порядок.
блаженство

2
@blissweb Не повинна бути проблемою, оскільки ви можете замовити в оригінальному стовпці, а не на виході функції Формат.
Маттен

25

ви можете використовувати

select cast((630/60.0) as  decimal(16,2))


5
CAST(QuantityLevel AS NUMERIC(18,2))

2
Ласкаво просимо до переповнення стека! Дякуємо за фрагмент коду, який може надати деяку обмежену, негайну допомогу. Правильне пояснення значно покращило б його довгострокове значення , описавши, чому це хороше рішення проблеми, та зробило б її кориснішою для майбутніх читачів з іншими подібними питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
sepehr


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.


3

Що б ви використовувати в деномінації повинні бути в десяткової системі числення, наприклад , 1548/100дасть15.00

Якщо ми замінимо 100з 100.0в нашому прикладі, ми отримаємо15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0

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

Як доповнення до наведених нижче відповідей, використовуючи INT або недесяткові типи даних у своїх формулах, не забудьте помножити значення на 1 і кількість крапкових знаків.

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

таким чином:

((m.TotalPackages * 1.000000) / m.TotalContainers) AS Packages,

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

0

Я вважаю, що функція STR є найчистішим засобом досягнення цього.

SELECT STR(ceiling(123.415432875), 6, 2)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.