Oracle中的Round和Trunc
一、Oracle中的Round和Trunc:
如同對數(shù)字進行四舍五入和按位截取一樣,Oracle對時間日期也提供了這兩種功能。但比起對數(shù)字進行四舍五入和截取比較復雜:這是因為時間日期是有格式的。下面看看這兩個函數(shù)的定義和用途:
ROUND(date [, format])
TRUNC(date [, format])
Round函數(shù)對日期進行“四舍五入”,Trunc函數(shù)對日期進行截取。如果我們不指定格式的話,Round會返回一個最接近date參數(shù)的日期,而Trunc函數(shù)只會簡單的截取時分秒部分,返回年月日部分。
二、Round和Trunc函數(shù)示例:
?? 2 ???????????? to_char( Round (sysdate), ' yyyy-mm-dd?hh24:mi:ss ' )?round_date,
?? 3 ???????????? to_char(Trunc(sysdate), ' yyyy-mm-dd?hh24:mi:ss ' )?trunc_date
?? 4 ???? from ?dual;
NOW_DATE???????????????????????????????ROUND_DATE?????????????????????????????TRUNC_DATE
-- ------------------------------------?--------------------------------------?----------------------
2008 - 06 - 30 ? 14 : 52 : 13 ???????????????????? 2008 - 07 - 01 ? 00 : 00 : 00 ???????????????????? 2008 - 06 - 30 ? 00 : 00 : 00
這是一個典型的例子,由于我們沒有指定round和trunc函數(shù)的格式,所以Oracle默認采用了按日期時間的格式,該例子中當前的時間是下午 14:52分,已經(jīng)超過了12:00 AM這個中界線,所以Round返回07-01日而非06-30日。而Trunc不管三七二十一直接截取前面日期部分返回。
另外一個值得注意的地方是這兩個函數(shù)返回的時分秒都是00:00:00,即一天的開始時間(對于12小時制的返回的是12:00:00 AM)。
三、指定格式的Round和Trunc函數(shù)示例:
如果我們對Round函數(shù)和Trunc函數(shù)指定了格式,事情就變得有點復雜了,不過核心思想還是不變:Round是四舍五入,Trunc是截取。舉個例子來說,假如我們以年為格式,則現(xiàn)在Oracle的判斷是基于年來判斷,超過一年的一半(即6月30日),Round函數(shù)則返回下一年了,Trunc函數(shù)依然返回當前年。
?? 2 ???????????? Round (sysdate,? ' yyyy ' )?Round_year,
?? 3 ???????????? Trunc(sysdate,? ' yyyy ' )?Trunc_year
?? 4 ???? from ?dual;
Now?date???ROUND_YEAR?TRUNC_YEAR
-- --------?----------?----------
30 - 6月? - 08 ? 01 - 1月? - 08 ? 01 - 1月? - 08
關于這兩個函數(shù)可用的格式非常多,但日常應用中用得比較多的基本上就這幾個,以Round函數(shù)為例:
???????? Round (sysdate,? ' Month ' )?Rnd_Month,
???????? Round (sysdate,? ' WW ' )?Rnd_Week,
???????? Round (sysdate,? ' W ' )?Rnd_Week_again,
???????? Round (sysdate,? ' DDD ' )?Rnd_day,
???????? Round (sysdate,? ' DD ' )?Rnd_day_again,
???????? Round (sysdate,? ' DAY ' )?Rnd_day_of_week,
???????? Round (sysdate,? ' D ' )?Rnd_day_of_week_again,
???????? Round (sysdate,? ' HH12 ' )?Rnd_hour_12,
???????? Round (sysdate,? ' HH24 ' )?Rnd_hour_24,
???????? Round (sysdate,? ' MI ' )?Rnd_minute
?? from ?dual
?
?
四、用trunc函數(shù)處理日期
?日期用例 '2008-11-28 12:59:59'周五??
1.沒有fmt部分時
???語句:?SELECT?? TRUNC(TO_DATE('2008-11-28 12:00:01','YYYY-MM-DD hh24:mi:ss')) FROM?? DUAL;
??????????結(jié)果: 2008-11-28??
????????
2.得到最當前日期之前的最近的一個周日的日期
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'D') FROM?? DUAL;???
???結(jié)果: 2008-11-23 周日
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'D')+1 FROM?? DUAL;???
???結(jié)果: 2008-11-24 周一
?
3.得到最當前日期的所在月份的第一天
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'MM') FROM?? DUAL;???
???結(jié)果: 2008-11-1
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'MM')-1 FROM?? DUAL;?
???結(jié)果: 2008-10-31
?
4.得到最當前日期的所在年份的第一天
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'Y') FROM?? DUAL;???
???結(jié)果: 2008-1-1
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'Y')-1 FROM?? DUAL;?
???結(jié)果: 2007-12-31
轉(zhuǎn)載于:https://www.cnblogs.com/xhk1228/archive/2013/04/11/3194877.html
總結(jié)
以上是生活随笔為你收集整理的Oracle中的Round和Trunc的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinRAR 命令行简体中文说明
- 下一篇: autolisp 列表 resbuf