函數(shù)trunc是一個Oracle內(nèi)置的函數(shù),可以對date類型數(shù)據(jù)進(jìn)行“度身裁剪”,來適應(yīng)不同類型的數(shù)據(jù)需求。
在前篇《Oracle日期類型操作幾個問題》中,我們已經(jīng)了解到date類型的基本知識。date類型是一種包括年、月、日、時、分和秒的數(shù)據(jù)類型,可以表示相對精確的時間信息。內(nèi)部存儲上,date類型是類似于數(shù)字類型的,可以通過加減操作實現(xiàn)對日期的推進(jìn)和后退。
但是,日期格式的精確常常給我們帶來一些困擾,特別是其中的時分秒信息。很多時候,我們對這部分信息是不需要的。比如指定日期查詢、只顯示天信息等等。借助To_char雖然可以實現(xiàn)一部分這種需要,但是這樣做格式上比較復(fù)雜,而且進(jìn)行了數(shù)據(jù)類型的轉(zhuǎn)換。是否存在不變化數(shù)據(jù)類型的方法,對日期型數(shù)據(jù)進(jìn)行處理。答案就是trunc函數(shù)。
trunc(date)
截斷函數(shù)trunc的作用就是將日期類型數(shù)據(jù)按照指定格式截斷,返回一個日期變量數(shù)據(jù)。例如:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2010-12-10 20:39:58
SQL> select trunc(sysdate) from dual;
TRUNC(SYSDATE)
--------------
2010-12-10
SQL> select to_char(trunc(sysdate),'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(TRUNC(SYSDATE),'YYYY-M
------------------------------
2010-12-10 00:00:00
默認(rèn)情況下,sysdate函數(shù)返回的日期類型數(shù)據(jù)包括當(dāng)前的具體時間。通過trunc(date)的處理,直接截取到天信息,返回指定天的零時。
trunc函數(shù)還支持一個重載參數(shù),格式字符串:trunc(date,‘format’),用于指定截斷的位置。如下:
//截斷到年
SQL> select trunc(sysdate,'yyyy') from dual;
TRUNC(SYSDATE,'YYYY')
---------------------
2010-1-1
//截斷到月
SQL> select trunc(sysdate,'mm') from dual;
TRUNC(SYSDATE,'MM')
-------------------
2010-12-1
//截斷到日
SQL> select trunc(sysdate,'dd') from dual;
TRUNC(SYSDATE,'DD')
-------------------
2010-12-10
//截斷到小時
SQL> select trunc(sysdate,'hh24') from dual;
TRUNC(SYSDATE,'HH24')
---------------------
2010-12-10 20:00:00
//截斷到分鐘
SQL> select trunc(sysdate,'mi') from dual;
TRUNC(SYSDATE,'MI')
-------------------
2010-12-10 20:52:00
使用不同的格式標(biāo)志,可以指示不同的截斷位置,獲取各種零刻時間。
|
格式字符串 |
說明 |
年 |
yyyy或者year |
年度第一天(一月一日零時) |
月 |
mm或者month |
月份第一天(一日零時) |
日 |
dd或者day |
日期零時(00:00:00) |
小時 |
hh或者h(yuǎn)h24 |
幾時整(XX:00:00) |
分 |
mi |
幾分整(XX:XX:00) |
借助trunc函數(shù)和日期類型加減處理,我們可以實現(xiàn)一些特殊日期的設(shè)置,實現(xiàn)日期功能,使用在例如Job調(diào)度方面。
//明天零點
SQL> select to_char(trunc(sysdate)+1,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(TRUNC(SYSDATE)+1,'YYYY
------------------------------
2010-12-11 00:00:00
//當(dāng)天早上十點
SQL> select to_char(trunc(sysdate)+10/24,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(TRUNC(SYSDATE)+10/24,'
------------------------------
2010-12-10 10:00:00
//當(dāng)月三號,上午10點半
SQL> select to_char(trunc(sysdate,'mm')+2+10/24+1/48, 'yyyy-mm-dd hh24:mi:ss') from dual;
注:trunc(sysdate,'mm')將時間取到當(dāng)前月的1號零時零分零秒,那么加上2就表示當(dāng)前月的3好零時零分零秒,再加上'10/24'('10/24'本身表示10個小時)就是表示當(dāng)月3號的十點零分零秒,再加上'1/48'('1/48'本身表示30分鐘)就表示當(dāng)月3號十點三十分零秒
TO_CHAR(TRUNC(SYSDATE,'MM')+2+
------------------------------
2010-12-03 10:30:00
較復(fù)雜的to_char,trunc更加可以發(fā)揮日期類型數(shù)值本身的特色和優(yōu)勢,無論是代碼整潔度還是處理效率都是值得關(guān)注的。
額外多說一句,trunc本身還具有處理數(shù)字截斷功能,用于截斷指定位數(shù)的數(shù)字類型。
//默認(rèn)截斷到整數(shù),不進(jìn)行四舍五入;
SQL> select trunc(15.743) from dual;
TRUNC(15.743)
-------------
15
//截斷到小數(shù)點后一位;
SQL> select trunc(15.793,1) from dual;
TRUNC(15.793,1)
---------------
15.7
//截斷到小數(shù)點前一位;
SQL> select trunc(15.793,-1) from dual;
TRUNC(15.793,-1)
----------------
10
trunc對數(shù)字和日期類型處理,也折射出日期類型數(shù)據(jù)和數(shù)字之間的間接關(guān)系。
原文地址:http://space.itpub.net/17203031/viewspace-681548
trunc不僅可以用來處理日期,還可以用來處理數(shù)字
TRUNC(i1,i2)截取i1的i2位而不四舍五入,如果i2是正就截取小數(shù)點右邊第幾位,如果是i2是負(fù)就是截取小數(shù)點左邊第幾位。
例如:
- select TRUNC(0.10005767,1) from dual;
-
- TRUNC(0.10005767,1) 1 0.1
而如果trunc函數(shù)沒有指定參i2,那么其作用為取整,且取整的時候不會四舍五入
例如:
- select TRUNC(2.60005767) from dual;
-
TRUNC(2.60005767)
round函數(shù)和trunc函數(shù)的區(qū)別:
ROUND(i1,i2)四舍五入,i1四舍五入,如果i2是正保留小數(shù)點后i2位。如果是i2是負(fù)數(shù),表示保留小數(shù)點前面(左邊第幾位)
TRUNC(i1,i2)截取i1的i2位而不四舍五入,如果i2是正就截取小數(shù)點右邊第幾位,如果是i2是負(fù)就是截取小數(shù)點左邊第幾位。