對於初學者來說,日期處理那快一向是問題的集中地.今天剛剛看了個案例,將的就是ORACLE日期處理中的錯誤,其關鍵原因,就是TO_CHAR 和TO_DATE的用法不清晰,,事實上,這兩個東西也特別容易混淆,為此,把他們的區別再介紹下.
to char 是把日期或數字轉換為字符串
to date 是把字符串轉換為數據庫中得日期類型
轉換函數
TO_CHAR
使用TO_CHAR函數處理數字
TO_CHAR(number, '格式')
TO_CHAR(salary,’$99,999.99’);
使用TO_CHAR函數處理日期
TO_CHAR(date,’格式’);
TO_NUMBER
使用TO_NUMBER函數將字符轉換為數字
TO_NUMBER(char[, '格式'])
TO_DATE
使用TO_DATE函數將字符轉換為日期
TO_DATE(char[, '格式'])
TO_DATE:
spl> select * from emp
where dates
between
to_date('2007-06-12 10:00:00', 'yyyy-mm-dd hh24:mi:ss')
and
to_date('2007-06-12 10:00:00', 'yyyy-mm-dd hh24:mi:ss')
當省略HH、MI和SS對應的輸入參數時,Oracle使用0作為DEFAULT值。如果輸入的日期數據忽略時間部分,Oracle會將時、分、秒部分都置為0,也就是說會取整到日。
同樣,忽略了DD參數,Oracle會采用1作為日的默認值,也就是說會取整到月。
但是,不要被這種“慣性”所迷惑,如果忽略MM參數,Oracle並不會取整到年,取整到當前月。
注意:
1.在使用Oracle的to_date函數來做日期轉換時,可能會直覺地采用“yyyy-MM-dd HH:mm:ss”的格式作為格式進行轉換,但是在Oracle中會引起錯誤:“ORA 01810 格式代碼出現兩次”。如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;
原因是SQL中不區分大小寫,MM和mm被認為是相同的格式代碼,所以Oracle的SQL采用了mi代替分鍾。select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;
2.另要以24小時的形式顯示出來要用HH24
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分鍾
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm會顯示月份
TO_CHAR:
1、
TO_CHAR ( nchar | clob | nclob )
以接受NCHAR, NVARCHAR2, CLOB, NCLOB類型的字符串作為自己的參數,把它們轉換成數據庫的字符集的字符串。請看下面這個例子:
這個是national 字符集的情況:
這個是clob的情況:
09:59:03 SQL> create table t(a clob) ; Table created.
09:59:15 SQL> insert into t values ('aaaaaaaaaaaaaaaaaaaaaaaaaa') ; 1 row created.
09:59:31 SQL> select * from t; A -------------------------------------------------------------------------------- aaaaaaaaaaaaaaaaaaaaaaaaaaa
10:00:03 SQL> select to_char(a) from t TO_CHAR(A) ---------------------------------------------------------------------------------------------------------------------- aaaaaaaaaaaaaaaaaaaaaaaaaaa |
2、
TO_CHAR ( date [, fmt [, 'nlsparam'] ])
它的作用是將一個日期date轉換成一個指定格式fmt的字符串。有關nlsparam基本可以不管,它是用來確定返回的日期的名字以及縮寫詞等的形式,如你的數據庫語言如果是英語,那么返回的月份表示可能是類似這樣的“MAY”;而如果你的數據庫語言是漢語,那么返回的月份表示可能是類似這樣的“五月”。nlsparam就是用來改變這些顯示,如假設你的數據庫語言是漢語,而你像把它變成英語的表示,則可以這樣設置:nls_date_language=’english’。99%可以不用管這個參數。如下面這個例子:
10:13:29 SQL> select to_char(sysdate,'yyyy-mm-dd') today from dual; TODAY ---------- 2007-09-24 |
可能大家問題最多的就是fmt這個格式設置有哪些了,下面我列出一個列表來說明這些:
元素 |
表示含義 |
- / , . ; : “test” |
這些標點符號和具體的字符串,最終會顯示出來,其實他們啟到的作用就是分隔,如下面這個日期: 2007-9-16 這里符合“-”就啟到了分隔年月日的作用。 |
AD A.D. |
公元后 |
BC B.C. |
公元前 |
AM A.M. |
早上,上午 |
PM P.M. |
下午 |
D |
一周的第幾天,星期天是1 |
DAY |
星期幾,,一共用9個字符大小來顯示,如果沒有這么長,名稱的右邊用空格來填充 |
DD |
一個月的第幾天,【1~31】 |
DDD |
一年的第幾天,【1~366】 |
DY |
星期幾,但是是簡稱,如周一可能就是MON |
FF[0..9] |
這個是用於timestamp類型的,用於表示將秒分成多少位數來表示,在FF后面跟上一個0到9的數字。 |
HH |
小時,【1~12】 |
HH12 |
小時,【1~12】 |
HH24 |
小時,【0~23】 |
MI |
分鍾,【0~59】 |
MM |
月份,【01~12】 |
MON |
月份,但是是月份的簡稱,如1月可能是JAN來表示 |
MONTH |
月份,月份的名稱,如9月可能是september來表示,一共用9個字符大小來顯示,如果沒有這么長,名稱的右邊用空格來填充 |
Q |
季節,【1,2,3,4】分別代表春夏秋冬 |
SS |
秒,【0~59】 |
SSSS |
從午夜0秒開始計算到現在的秒數 |
WW |
一年的第幾個周,【1~53】 |
W |
一個月的第幾個周,【1~5】 |
Y,YYY |
年份,中間有個逗號 |
YEAR SYEAR |
年份,用字符串顯示,S表示指示公元前(BC)使用“-”表示 |
YYYY SYYY |
4個數字的年份,S表示指示公元前(BC)使用“-”表示 |
YYY YY Y |
分別表示年份的后面三個、兩個、一個數字 |
[@more@]