SELECT CAST(height AS DECIMAL(18,0))/10
Edit: Come funziona sotto il cofano?
Il tipo di risultato è uguale al tipo di entrambi gli argomenti oppure, se sono diversi, è determinato dallo data type precedence table. È quindi possibile trasmettere entrambi gli argomenti a qualcosa di non integrale.
Ora DECIMAL(18,0)
, o si potrebbe equivalentemente scrivere solo DECIMAL
, è ancora una sorta di tipo intero, perché quella scala di default di 0
significa "nessun cifre a destra del punto decimale". Quindi, un cast ad esso potrebbe, in circostanze diverse, funzionare bene per arrotondare a interi: l'opposto di ciò che stiamo cercando di realizzare.
Tuttavia, DECIMAL ha le proprie regole per tutto. Sono generalmente non interi, ma sempre numeri esatti. Il tipo di risultato della divisione DECIMAL che abbiamo forzato a verificarsi è is determined specially, nel nostro caso, DECIMAL (29,11). Il risultato della divisione sarà quindi arrotondato a 11 posizioni che non interessano la divisione di 10, ma l'arrotondamento diventa osservabile dividendo per 3. È possibile controllare la quantità di arrotondamento manipolando la scala dell'operando di sinistra. Puoi anche arrotondare di più, ma non di meno, posizionando un'altra operazione ROUND o CAST intorno all'intera espressione.
meccanica identici governa la soluzione più semplice e più piacevole la risposta accettata:
SELECT height/10.0
In questo caso, il tipo di divisore è DECIMAL(3,1)
e il tipo del risultato è DECIMAL(17,6)
. Prova a dividere per 3 e osserva la differenza nell'arrotondamento.
Se basta odio tutto questo parlare di precisioni e scale, e vogliono solo SQL server per eseguire tutti i calcoli in buon vecchio doppia precisione floating aritmetica in virgola da un certo punto in poi, è possibile forzare anche questo:
SELECT height/CAST(10 AS FLOAT(53))
o equivalentemente semplicemente
SELECT height/CAST (10 AS FLOAT)
+1 per la prima parte, ma attenzione al secondo esempio. Questo 'CONVERT' è applicato post-divide e non può darti più di 6 cifre decimali che hai già. –
soluzione perfetta !! Immagino che prima si esibisca meglio! non è vero? – Diablo
@Diablo Bene, potresti testarlo, ma dubito che noterai qualche differenza. Ad ogni modo, se hai bisogno di precisione/scala specifiche, esegui questa formattazione nel tuo livello applicazione. –