SQLServer中 ROUND函數、CAST 和 CONVERT函數 的使用詳解

一、ROUND函數

返回數字表達式並四捨五入爲指定的長度或精度。

1、語法

ROUND ( numeric_e-xpression , length [ , function ] )

參數 描述
numeric_e-xpression 必需。精確數字或近似數字數據類型類別的表達式(bit 數據類型除外)。
length 必需。將要四捨五入的精度。length 必須是 tinyint、smallint 或int。當 length 爲正數時,numeric_e-xpression 四捨五入爲 length 所指定的小數位數。當 length 爲負數時,numeric_e-xpression 則按 length 所指定的在小數點的左邊四捨五入。
function

選填。要執行的操作類型。function 必須是 tinyint、smallint 或 int。如果省略 function 或 function 的值爲 0(默認),numeric_e-xpression 將四捨五入。當指定 0 以外的值時,numeric_e-xpression 將截斷 。

 2、案例

------當第三個參數沒有設置的時候,默認爲0,也就是四捨五入-------
SELECT ROUND(925.678, 2)
-->925.680  結果並非只保留兩位小數,而是保留兩位有效的小數
SELECT ROUND(925.678, 0)
-->926.000  當精度爲0,取整數
SELECT ROUND(925.678, -2)
-->900.000  當精度爲負數時,根據小數點左邊位數進行四捨五入
SELECT ROUND(925.678, -4)
-->0.000  當精度是負數且大於小數點前的數字個數,ROUND 將返回 0。
SELECT ROUND(925.678, -3)
-->當精度是負數且等於小數點前的數字個數時,報錯:將 expression 轉換爲數據類型 numeric 時出現算術溢出錯誤!
-->原因是925.678這個常量的數據類型是decimal(6,3),而結果是1000.000,這便報錯了。
-->解決方法也簡單,轉換數據類型即可。如下:
SELECT ROUND(CAST(925.678 AS decimal(7,3)), -3)


------當第三個參數設置爲非0的數,直接截斷-------
SELECT ROUND(925.678,1,0)
-->925.700  
SELECT ROUND(925.678,1,2)
-->925.600

SELECT ROUND(925.678,-1,0)
-->930.000
SELECT ROUND(925.678,-1,2)
-->920.000

二、CAST 函數和CONVERT函數

    CAST函數和CONVERT函數功能類似,就語法有點差別,而且默認都是四捨五入的。CAST函數用的比較多,CONVERT函數的優點就是可以格式化日期和數值,待會細說。

1、語法

(1)CAST (expression AS data_type)

參數 描述
expression 必需。任何有效的SQServer表達式。
AS 必需。用於分隔兩個參數,在AS之前的是要處理的數據,在AS之後是要轉換的數據類型。
data_type

必需。目標系統所提供的數據類型,包括bigint和sql_variant,不能使用用戶定義的數據類型。如果轉換時沒有指定數據類型的長度,則SQServer自動提供長度爲30。

(2)CONVERT(data_type(length),data_to_be_converted,style)

參數 描述
data_type(length) 必需。data_type(length) 規定目標數據類型(帶有可選的長度)。
data_to_be_converted 必需。data_to_be_converted 含有需要轉換的值。
style

選填。style 規定日期/時間的輸出格式。默認0或100。

當格式化日期時,style可選填的值如下:

Style ID Style 格式
100 或者 0 mon dd yyyy hh:miAM (或者 PM)
101 mm/dd/yy
102 yy.mm.dd
103 dd/mm/yy
104 dd.mm.yy
105 dd-mm-yy
106 dd mon yy
107 Mon dd, yy
108 hh:mm:ss
109 或者 9 mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
110 mm-dd-yy
111 yy/mm/dd
112 yymmdd
113 或者 13 dd mon yyyy hh:mm:ss:mmm(24h)
114 hh:mi:ss:mmm(24h)
120 或者 20 yyyy-mm-dd hh:mi:ss(24h)
121 或者 21 yyyy-mm-dd hh:mi:ss.mmm(24h)
126 yyyy-mm-ddThh:mm:ss.mmm(沒有空格)
130 dd mon yyyy hh:mi:ss:mmmAM
131 dd/mm/yy hh:mi:ss:mmmAM

2、案例

 --> 截取字符串
SELECT CAST('12222asdfds' as varchar(8)); -->12222asd
SELECT CONVERT(varchar(8), '12222asdfds'); -->12222asd
 --> 先將數字 1 轉換成 字符串,兩個字符串間進行相加
SELECT 'ABC' + CAST(1 AS varchar(3));  -->ABC1 

 --> 字符串轉INT類型
SELECT CAST('123' as int)  -->123
SELECT CONVERT(int, '123')  -->123
 --> decimal/float轉INT類型
SELECT CAST(123.5 as int)   -->123
SELECT CONVERT(int, 123.5)  -->123 
 --> 只能強轉相近的數值類型,所以報錯:在將 varchar 值 '123.567' 轉換成數據類型 int 時失敗。
SELECT CAST('123.567' as int)
SELECT CONVERT(int, '123.567')

 --> 不能轉成INT,但帶小數位的字符串,可以定義decimal類型
SELECT CAST('123.567' as decimal(9,2))  -- 123.50
SELECT CONVERT(decimal(9,2), '123.567') -- 123.50
 --> decimal類型,如果不定義精度和小數位,默認爲精度爲18,小數位爲0。
SELECT CAST('123.5' as decimal)  -- 124
SELECT CONVERT(decimal, '123.5') -- 124 

 --> 字符串轉換成時間
SELECT CAST('2018-06-02' AS datetime);  
SELECT CONVERT(datetime, '2018-06-02');

  ---------------CONVERT函數----------------

 --> 格式化日期
SELECT CONVERT(VARCHAR,GETDATE())
SELECT CONVERT(VARCHAR,GETDATE(),110) 
SELECT CONVERT(VARCHAR,GETDATE(),106)
SELECT CONVERT(VARCHAR,GETDATE(),113)
 --> 格式化數值
DECLARE @Num money
SET @Num = 7856781234.5678
SELECT CONVERT(varchar(20), @Num, 0)  -- 7856781234.57
SELECT CONVERT(varchar(20), @Num, 1)  -- 7,856,781,234.57
SELECT CONVERT(varchar(20), @Num, 2)  -- 7856781234.5678


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章