1. 程式人生 > 實用技巧 >Oracle函式:trunc、round、ceil和floor

Oracle函式:trunc、round、ceil和floor

1.trunc函式

1).trunc(date)

格式:trunc(date,fmt)
trunc用於擷取時間,即便你指定不同的格式型別,返回的型別始終都是時間型別。
示例:

with dates as (
    select date'2015-01-01' d from dual union
    select date'2015-01-10' d from dual union
    select date'2015-02-01' d from dual union
    select timestamp'2015-03-03 23:45:00' d from dual union
    select timestamp'2015-04-11 12:34:56' d from dual
    )
    select d "原先的時間",
       trunc(d) "最近的一天",
       trunc(d, 'ww') "最近的一週",
       trunc(d, 'iw') "一週的開始",
       trunc(d, 'mm') "一月的開始",
       trunc(d, 'year') "一年的開始"
    from dates;

執行結果:

2).trunc(number)

格式:trunc(n1,n2)
trunc用於擷取數字型別,返回n1中擷取n2個小數位。如果n2沒有傳,則預設為0,即擷取所有小數部分。n2還可以為負數,表示擷取小數點往左邊取位數。
示例:

with number1 as (
    select 1234.1 n from dual union
    select 1234.12 n from dual union
    select 1234.123 n from dual union
    select 1234.1234 n from dual
    )
    select n "原來的數字",
    trunc(n) "取整",
    trunc(n,0) "取整",
    trunc(n, 1) "取小數一位",
    trunc(n, -1) "忽略整數一位取0"
    from number1;

執行結果:

2.round函式

1).round(date)

格式:round(date,fmt)
傳入的date引數必須為時間型別,返回結果始終為date型別
示例:

   select round (date'2020-12-18','year') "new year" from dual;
執行結果:

2).round(number)

格式:round(n,integer)
如果n為0,不管integer是多少,始終返回0;
如果n為負數,則round(n,integer),返回-round(-n,integer),注意:這裡的n為負值
如果n為正數,則ROUND(n, integer) = FLOOR(n * POWER(10, integer) + 0.5) * POWER(10, -integer),其實就是四捨五入
tips:剛開始看的時候覺得好奇,為什麼官網不直接告訴是四捨五入呢,才明白,人家這是告訴我裡面的算術邏輯啊~~,如果自己要實現四捨五入,則可以按這個邏輯來實現
power(x,y):x的y次方
示例:

with eg as (
    select 0 n from dual union
    select 12.123 n from dual union
    select 12.153 n from dual union
    select -12.123 n from dual union
    select -12.153 n from dual
)
select
n "原來的數字",
round(n, 1) "小數點後取一位",
round(n, 2) "小數點後取兩位"
from eg;

執行結果:

3.ceil函式

格式:ceil(n)
返回大於等於n的最小整數
select ceil(1.11) from dual;//結果2

4.floor函式

格式:floor(n)
返回小於等於n的最大整數
select floor(1.11) from dual;//結果1

附錄:fmt格式參考地址