【TRUNC】使用TRUNC函式完成對時間的擷取

secooler發表於2010-03-30
使用TRUNC函式可以完成時間的擷取功能。

1.設定一下時間的顯示樣式
sec@secooler> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

Session altered.

2.以系統時間為例,檢視當前時間
sys@secooler> select sysdate from dual;

SYSDATE
-------------------
2010-03-31 00:22:48

3.不使用參數列示擷取到日
sys@secooler> select trunc(sysdate) trunc_default from dual;

TRUNC_DEFAULT
-------------------
2010-03-31 00:00:00

4.擷取到年
以下八種方法都可以完成擷取到年的功能。
sys@secooler> select trunc(sysdate,'YEAR') trunc_year from dual;

TRUNC_YEAR
-------------------
2010-01-01 00:00:00

sys@secooler> select trunc(sysdate,'SYYYY') trunc_year from dual;

TRUNC_YEAR
-------------------
2010-01-01 00:00:00

sys@secooler> select trunc(sysdate,'YYYY') trunc_year from dual;

TRUNC_YEAR
-------------------
2010-01-01 00:00:00

sys@secooler> select trunc(sysdate,'SYEAR') trunc_year from dual;

TRUNC_YEAR
-------------------
2010-01-01 00:00:00

sys@secooler> select trunc(sysdate,'YYY') trunc_year from dual;

TRUNC_YEAR
-------------------
2010-01-01 00:00:00

sys@secooler> select trunc(sysdate,'YYY') trunc_year from dual;

TRUNC_YEAR
-------------------
2010-01-01 00:00:00

sys@secooler> select trunc(sysdate,'YY') trunc_year from dual;

TRUNC_YEAR
-------------------
2010-01-01 00:00:00

sys@secooler> select trunc(sysdate,'Y') trunc_year from dual;

TRUNC_YEAR
-------------------
2010-01-01 00:00:00

5.擷取到月
以下四種方法都可以完成擷取到月的功能。
sys@secooler> select trunc(sysdate,'MONTH') trunc_mounth from dual;

TRUNC_MOUNTH
-------------------
2010-03-01 00:00:00

sys@secooler> select trunc(sysdate,'MON') trunc_mounth from dual;

TRUNC_MOUNTH
-------------------
2010-03-01 00:00:00

sys@secooler> select trunc(sysdate,'MM') trunc_mounth from dual;

TRUNC_MOUNTH
-------------------
2010-03-01 00:00:00

sys@secooler> select trunc(sysdate,'RM') trunc_mounth from dual;

TRUNC_MOUNTH
-------------------
2010-03-01 00:00:00

6.擷取到日
以下三種方法都可以完成擷取到日的功能。
sys@secooler> select trunc(sysdate,'DDD') trunc_day from dual;

TRUNC_DAY
-------------------
2010-03-31 00:00:00

sys@secooler> select trunc(sysdate,'DD') trunc_day from dual;

TRUNC_DAY
-------------------
2010-03-31 00:00:00

sys@secooler> select trunc(sysdate,'J') trunc_day from dual;

TRUNC_DAY
-------------------
2010-03-31 00:00:00

7.擷取到小時
以下三種方法都可以完成擷取到小時的功能。
sys@secooler> select trunc(sysdate,'HH') trunc_hour from dual;

TRUNC_HOUR
-------------------
2010-03-31 00:00:00

sys@secooler> select trunc(sysdate,'HH12') trunc_hour from dual;

TRUNC_HOUR
-------------------
2010-03-31 00:00:00

sys@secooler> select trunc(sysdate,'HH24') trunc_hour from dual;

TRUNC_HOUR
-------------------
2010-03-31 00:00:00

8.擷取到分鐘
sys@secooler> select trunc(sysdate,'MI') trunc_minute from dual;

TRUNC_MINUTE
-------------------
2010-03-31 00:22:00

9.trunc應用--解決因時分秒不同導致無返回記錄的問題
sys@secooler> create table t (x date,y timestamp);

Table created.

sys@secooler> insert into t values (sysdate,sysdate);

1 row created.

sys@secooler> update t set y=sysdate;

1 row updated.

sys@secooler> commit;

Commit complete.

sys@secooler> select * from t;

X                   Y
------------------- ------------------------------------
2010-03-31 00:31:20 31-MAR-10 12.31.28.000000 AM

此時我們如果直接查詢x與y相等的記錄是沒有返回結果的。
sys@secooler> select * from t where x = y;

no rows selected

如果我們同時使用trunc擷取到天,結果將不同
sys@secooler> select * from t where trunc(x,'DD')=trunc(y,'DD');

X                   Y
------------------- ------------------------------------
2010-03-31 00:31:20 31-MAR-10 12.31.28.000000 AM

10.小結
在Oracle資料中日期的操作相對複雜,如果可以善加利用與日期相關的函式,便會達到事半功倍的效果。

Good luck.

secooler
10.03.30

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-630855/,如需轉載,請註明出處,否則將追究法律責任。

相關文章