一、
Oracle
中的
Round
和Trunc:
如同對數字進行四舍五入和按位截取一樣,
Oracle
對時間日期也提供了這兩種功能。但比起對數字進行四舍五入和截取比較復雜:這是因為時間日期是有格式的。下面看看這兩個函數的定義和用途:
ROUND
(date [, format])
TRUNC(date [, format])
Round
函數對日期進行“四舍五入”,Trunc函數對日期進行截取。如果我們不指定格式的話,
Round
會返回一個最接近date參數的日期,而Trunc函數只會簡單的截取時分秒部分,返回年月日部分。
二、
Round
和Trunc函數示例:









這是一個典型的例子,由于我們沒有指定
round
和trunc函數的格式,所以
Oracle
默認采用了按日期時間的格式,該例子中當前的時間是下午 14:52分,已經超過了12:00 AM這個中界線,所以
Round
返回07-01日而非06-30日。而Trunc不管三七二十一直接截取前面日期部分返回。
另外一個值得注意的地方是這兩個函數返回的時分秒都是00:00:00,即一天的開始時間(對于12小時制的返回的是12:00:00 AM)。
三、指定格式的
Round
和Trunc函數示例:
如果我們對
Round
函數和Trunc函數指定了格式,事情就變得有點復雜了,不過核心思想還是不變:
Round
是四舍五入,Trunc是截取。舉個例子來說,假如我們以年為格式,則現在
Oracle
的判斷是基于年來判斷,超過一年的一半(即6月30日),
Round
函數則返回下一年了,Trunc函數依然返回當前年。








關于這兩個函數可用的格式非常多,但日常應用中用得比較多的基本上就這幾個,以
Round
函數為例:












?
?
四、用trunc函數處理日期
? 日 期用例 '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;
??????????結果:
2008-11-28?
?
????????
2.得到最當前日期之前的最近的一個周日的日期
???語句:
SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),
'D')
FROM?? DUAL;???
???結果:
2008-11-23 周日
???語句:
SELECT??
TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),
'D')+1
FROM?? DUAL;???
???結果:
2008-11-24 周一
?
3.得到最當前日期的所在月份的第一天
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),
'MM')
FROM?? DUAL;???
???結果:
2008-11-1
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'), 'MM')-1 FROM?? DUAL;?
???結果: 2008-10-31
?
4.得到最當前日期的所在年份的第一天
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),
'Y')
FROM?? DUAL;???
???結果:
2008-1-1
???語句: SELECT?? TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'), 'Y')-1 FROM?? DUAL;?
???結果: 2007-12-31
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
