DATE類型默認(rèn)格式的設(shè)置
?
???
今天在工作中發(fā)現(xiàn)一個(gè)問題,同樣的代碼在同事的機(jī)子上可以執(zhí)行,在我的機(jī)子上報(bào)錯(cuò)。在分析了之后,發(fā)現(xiàn)是date類型數(shù)據(jù)的默認(rèn)格式問題引起的。到網(wǎng)上查了一下,發(fā)現(xiàn)遇到這個(gè)問題的人算是不少,但是能說清楚的也沒幾個(gè)人,所以專門研究了一下這個(gè)問題,基本上得到了答案,具體的過程如下:
?
?
??? 首先把問題重現(xiàn)一下,SQL做了一些簡化,代碼如下:
?
SQL > select to_date(to_char(last_day(add_months(sysdate,-1)),'YYYY-MM-DD')) from dual;
?????????????? *
ERROR at line 1:
ORA-01861: literal does not match format string
?
?
??? 發(fā)現(xiàn)應(yīng)該是date類型的默認(rèn)格式的問題。在同事機(jī)子上的默認(rèn)格式本身就是'YYYY-MM-DD'的,所以在to_date函數(shù)后面,對'YYYY-MM-DD'格式的char無需再指定date格式類型,但是如果char格式與默認(rèn)不一致,則會報(bào)錯(cuò)。
?
??? date類型的默認(rèn)格式由啟動(dòng)參數(shù) nls_date_format 指定
?
SQL > select * from nls_database_parameters where PARAMETER = 'NLS_DATE_FORMAT';
???
PARAMETER?????? VALUE
--------------- ----------------
NLS_DATE_FORMAT DD-MON-RR
?
SQL
> select sysdate from dual;
?
SYSDATE
-----------
2008-NOV-05
?
??? 發(fā)現(xiàn)系統(tǒng)的默認(rèn)NLS_DATE_FORMAT參數(shù)值為DD-MON-RR。
再查看當(dāng)前DATABASE的該參數(shù):
?
SQL > show parameter nls_date_format
?
NAME??????????????? TYPE??????? VALUE
------------------- ----------- --------------------
nls_date_format???? string
?
??? 發(fā)現(xiàn)當(dāng)前數(shù)據(jù)庫未設(shè)定該參數(shù)。
由于這個(gè)是系統(tǒng)的啟動(dòng)參數(shù),不能直接用alter database來修改,所以可以通過修改當(dāng)前session來暫時(shí)實(shí)驗(yàn)一下:
?
SQL
> alter session set nls_date_format='yyyy-mm-dd';
?
Session altered.
?
SQL
> select sysdate from dual;
?
SYSDATE
----------
2008-11-05
?
??? 再試一下之前的那段SQL
?
SQL > select to_date(to_char(last_day(add_months(sysdate,-1)),'YYYY-MM-DD')) from dual;
?
TO_DATE(TO
----------
2008-10-31
?
?
??? 如果需要一直都這樣顯示,則可以修改注冊表、添加環(huán)境變量,或直接修改啟動(dòng)參數(shù)文件。
?
?
?