一、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