oracle trunc年,Oracle的Trunc和round的区别
一,對數字的操作
sql>select trunc(5.75),
trunc(5.75,1), trunc(5.75,-1) from dual
trunc(x [,y]),其中如果沒有指定y,則對x在0位小數進行截斷
Eg:TRUNC(5.75)=5,如果y是負數,則對x在小數點左邊的第|y|位處進行截斷
TRUNC(5.75, -1)=0,這里應對小數點左邊的第|-1|位截取,為什么是0,不是5?
另外ROUND函數是對數值進行取整.
Eg:Round(5.75)=6,表示對5.75在0位小數處進行取整四舍五入了?
Round(5.75, 1)=5.8,這里第1位小數是5?取整進行了四舍五入?
ROUND(5.75, -1)=10,對5.75在左邊第|-1|位取整,左邊第一位就是十位?5是個位,是第0位?
解答如下:
第一個問題 如果y是負數,則對x在小數點左邊的第|y|位處進行截斷,例如:TRUNC(5.75,
-1)=0?5.75 看成 0005.75.000 從小數點左邊第一位往左邊截,不是0嗎
第二個問題,例如:ROUND(5.75)=6,表示對5.75在0位小數處進行取整,這里0位小數是7??0位小數是沒有,不是7, 7是第一位小數了。5.75取整 就是6啊,是四舍五入了啊,要不 round和trunc就沒區別了嘛。
ROUND(5.75,
1)=5.8,這里第1位小數是5??不是,第一位小數是7?四舍五入就是 5.8
ROUND(5.75,
-1)=10,對5.75在左邊第|-1|位取整,左邊第一位就是十位?小數點左邊第一位是個位,你同樣看成
00005.75000,從個位的左邊開始取,并四舍五入。 個位是5 左邊的十位是0,由于5是進1的,所以是10.
記起來有點困難喲!
二、對日期
一、Oracle中的Round和Trunc:
如同對數字進行四舍五入和按位截取一樣,Oracle對時間日期也提供了這兩種功能。但比起對數字進行四舍五入和截取比較復雜:這是因為時間日期是有格式的。下面看看這兩個函數的定義和用途:
ROUND(date [,
format])
TRUNC(date [, format])
Round函數對日期進行“四舍五入”,Trunc函數對日期進行截取。如果我們不指定格式的話,Round會返回一個最接近date參數的日期,而Trunc函數只會簡單的截取時分秒部分,返回年月日部分。
二、Round和Trunc函數示例:
SQL >
select
to_char(sysdate,
' yyyy-mm-dd?hh24:mi:ss
' )?now_date,
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函數的格式,所以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函數依然返回當前年。
SQL >
select
sysdate?"Now?date",
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
關于這兩個函數可用的格式非常多,但日常應用中用得比較多的基本上就這幾個,以Round函數為例:
select
Round
(sysdate, '
Q '
)?Rnd_Q,
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函數處理日期
日期用例
'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
總結
以上是生活随笔為你收集整理的oracle trunc年,Oracle的Trunc和round的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u盘或者移动硬盘插电脑上打不开,再点一下
- 下一篇: 华为畅享max有没有人脸识别_华为手机有