SQL: arrotondamento al secondo decimale


222

Devo convertire i minuti in ore, arrotondato al secondo decimale e visualizzare solo fino a 2 numeri dopo il punto decimale. Quindi se ho minuti come 650, quindi le ore dovrebbero essere 10,83

Ecco cosa ho finora:

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

Ma in questo caso, se i miei minuti sono, diciamo, 630 - ore sono 10.5000000. Ma lo voglio solo come 10.50 (dopo l'arrotondamento). Come posso raggiungere questo obiettivo?


3
Quale motore di database stai usando?
Ja͢ck,

1
Se T-SQL, questo è un duplicato di stackoverflow.com/questions/3190688/…
Cees Timmerman

Risposte:


378

Non potresti esprimere il tuo risultato come numeric(x,2)? Dovex <= 38

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

ritorna

10.500000   10.50

8
Strano. SELECT ROUND(630/60.0, 2);mi dà 10.50già.
Ja͢ck,

4
@ u07ch a cosa serve round () quando stai già usando un cast?
Ram

16
@Ram La domanda non ha specificato il motore del server sql - motivo per cui ho evidenziato il round v cast da solo. La conversione in valore numerico non esegue l'arrotondamento in tutti i motori, quindi se il numero calcolato fosse 10.809 otterresti 10.80 anziché 10.81 la domanda richiesta.
u07ch

1
@ u07ch Grazie per la risposta dettagliata. mi ha aiutato.
Ram

8
cast(630/60.0 as numeric(36,2))è enougth10,50
MrHIDEn

78

Come con SQL Server 2012, è possibile utilizzare la funzione di formato integrata :

SELECT FORMAT(Minutes/60.0, 'N2')

(solo per ulteriori letture ...)


2
Si noti che questo introduce anche migliaia di separatori, ad esempio1,757.47
8128

10
L'uso di "0.00" anziché di "N2" fornisce due cifre decimali senza il separatore delle migliaia.
8128

2
Sembra convertire in stringa? che rovina ordina per.
blissweb

2
@blissweb Non dovrebbe essere un problema, come è possibile ordinare sulla colonna originale, non sull'output della funzione Format.
Matten,

25

Puoi usare

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


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

2
Benvenuto in Stack Overflow! Grazie per lo snippet di codice, che potrebbe fornire un aiuto limitato e immediato. Una spiegazione adeguata migliorerebbe notevolmente il suo valore a lungo termine descrivendo perché questa è una buona soluzione al problema e la renderebbe più utile ai futuri lettori con altre domande simili. Modifica la tua risposta per aggiungere alcune spiegazioni, inclusi i presupposti che hai formulato.
sepehr,

4
DECLARE @porcentaje FLOAT

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

SELECT @porcentaje

3

Funziona sia con postgresql che con Oracle

SELECT ename, sal, round(((sal * .15 + comm) /12),2) 
FROM emp where job = 'SALESMAN' 

3

La seguente query è utile e semplice:

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

Fornisce output come 0,25.


3

Qualunque cosa tu usi in denominazione dovrebbe essere in decimale, per esempio 1548/100 ti darà15.00

Se sostituiamo 100con 100.0nel nostro esempio otterremo15.48

select 1548/100 
15.00000

select 1548/100.0
15.4800

0

3

Converti il ​​tuo numero in a NumericoDecimal .

Sostituisci la tua query con la seguente.

Server SQL

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

MySql:

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

La Castfunzione è un wrapper per la Convertfunzione. Abbinalo a SQL come linguaggio interpretato e il risultato è che anche se le due funzioni producono gli stessi risultati, c'è qualcosa di più dietro le quinte nella Castfunzione. L'uso della Convertfunzione comporta un piccolo risparmio, ma un piccolo risparmio si moltiplica.



2

Come componente aggiuntivo per le risposte di seguito, quando usi i tipi di dati INT o non decimali nelle tue formule, ricorda di moltiplicare il valore per 1 e il numero di decimali che preferisci.

cioè - TotalPackagesè un INTe quindi il denominatoreTotalContainers , ma voglio che il mio risultato abbia un massimo di 6 cifre decimali.

in tal modo:

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

1

Il seguente frammento potrebbe aiutarti:

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

Trovo che la funzione STR sia il mezzo più pulito per raggiungere questo obiettivo.

SELECT STR(ceiling(123.415432875), 6, 2)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.