對於初學者來講,日期處理那快一貫是問題的集中地.今天剛剛看了個案例,將的就是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:spa
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')ci
當省略HH、MI和SS對應的輸入參數時,Oracle使用0做爲DEFAULT值。若是輸入的日期數據忽略時間部分,Oracle會將時、分、秒部分都置爲0,也就是說會取整到日。字符串
一樣,忽略了DD參數,Oracle會採用1做爲日的默認值,也就是說會取整到月。io
可是,不要被這種「慣性」所迷惑,若是忽略MM參數,Oracle並不會取整到年,取整到當前月。table
注意:test
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:date
一、select
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 |
二、
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@]