Oracle與達夢中的decimal與Number區別

一、DECIMAL類型詳細

Oracle只是在語法上支持decimal類型,但是在底層實際上它就是number類型,支持decimal類型是爲了能把數據從Oracle數據庫移到其他數據庫中(如DB2等)。
因爲decimal在Oracle底層就是number類型,所以就當number類型使用就可以了,如果需要對這種字段類型轉爲char類型可以用to_char函數對其轉換。

decimal類型從根本上說應該是數字類型的,因爲oracle內部的數據類型,對於數字只有number類型,都當數字類型進行處理即可。decimal(8,2)代表數字總共8位長度,小數部分是2位。範圍是8位,精確到小數點後2位,並四捨五入,即存6位整數,兩位小數。也就是最大值可以是999999.99,可存放2位小數。Oracle中,可以使用to_char函數對數字進行轉換,使它變成字符類型.

二、NUMBER類型詳細

在Oracle中Number類型可以用來存儲0,正負定點或者浮點數,可表示的數據範圍在

1.0 * 10(-130) —— 9.9…9 * 10(125) {38個9後邊帶88個0}
的數字,當Oracle中的數學表達式的值>=1.0*10(126)時,Oracle就會報錯。

Number的數據聲明如下:

表示

作用

說明

Number(p, s)

聲明一個定點數

p(precision)爲精度,s(scale)表示小數點右邊的數字個數,精度最大值爲38,scale的取值範圍爲-84到127

Number§

聲明一個整數

相當於Number(p, 0)

Number

聲明一個浮點數

其精度爲38,要注意的是scale的值沒有應用,也就是說scale的指不能簡單的理解爲0,或者其他的數。

定點數的精度§和刻度(s)遵循以下規則:

當一個數的整數部分的長度> p-s 時,Oracle就會報錯

當一個數的小數部分的長度> s 時,Oracle就會舍入。

當s(scale)爲負數時,Oracle就對小數點左邊的s個數字進行舍入。

當s > p時, p表示小數點後第s位向左最多可以有多少位數字,如果大於p則Oracle報錯,小數點後s位向右的數字被舍入.

NUMBER類型細講

Oracle number datatype 語法:NUMBER[(precision [, scale])]
簡稱:precision --> p
scale --> s

NUMBER(p, s)
範圍:1 <= p <=38, -84 <= s <= 127
保存數據範圍:-1.0e-130 <= number value < 1.0e+126
保存在機器內部的範圍:1 ~ 22 bytes

有效位:從左邊第一個不爲0的數算起的位數。
s的情況:
s > 0
精確到小數點右邊s位,並四捨五入。然後檢驗有效位是否<= p。
s < 0
精確到小數點左邊s位,並四捨五入。然後檢驗有效位是否<= p + |s|。
s = 0
此時NUMBER表示整數。

eg:
Actual Data Specified As Stored As

123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(6,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(4,2) exceeds precision (有效位爲5, 5 > 4)
123.89 NUMBER(6,-2) 100
.01234 NUMBER(4,5) .01234 (有效位爲4)
.00012 NUMBER(4,5) .00012
.000127 NUMBER(4,5) .00013
.0000012 NUMBER(2,7) .0000012
.00000123 NUMBER(2,7) .0000012
1.2e-4 NUMBER(2,5) 0.00012
1.2e-5 NUMBER(2,5) 0.00001
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error (有效位爲5+2 > 6)
1234.9876 NUMBER(6) 1235 (s沒有表示s=0)
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error (有效位爲8 > 7)
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error (有效位爲10 > 9)
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error (0.10000, 有效位爲5 > 4)
0.01234567 NUMBER(4,5) 0.01235

0.09999 NUMBER(4,5) 0.09999

三、Oracle語句距離

項目中的語句:

    SELECT (CASE WHEN tt1.statistics_date is not null THEN tt1.statistics_date ELSE tt2.statistics_date END) AS statistics_date, NVL(tt1.actuser,0) AS actuser, NVL(tt2.new_user,0) AS new_user
            FROM
            (
              SELECT t.statistics_date, SUM(t.actuser) AS actuser FROM pdt_stat_act_1133_i t WHERE t.statistics_date like '2013-04%' and t.statistics_month = '2013-04' GROUP BY t.statistics_date
            ) tt1
            FULL JOIN
            (
              SELECT t2.statistics_date, SUM(t2.new_user) OVER(ORDER BY t2.statistics_date) AS new_user FROM (SELECT statistics_date AS statistics_date, SUM(new_user) AS new_user FROM pdt_stat_newuser_1133_i WHERE statistics_date like '2013-04%' GROUP BY statistics_date) t2
            ) tt2 ON tt1.statistics_date = tt2.statistics_date


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