??? 今天在工作中發現一個問題,同樣的代碼在同事的機子上可以執行,在我的機子上報錯。
??? 做了一些簡化之后的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
?
?
?
??? ****************************************************
?
??? 后來請教別人,發現應該是date類型的默認格式的問題。在同事機子上的默認格式本身就是'YYYY-MM-DD'的,所以在to_date函數后面,對'YYYY-MM-DD'格式的char無需再指定date格式類型,但是如果char格式與默認不一致,則會報錯。
?
??? date類型的默認格式由啟動參數 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
?
??? 發現系統的默認NLS_DATE_FORMAT參數值為DD-MON-RR。
?
?
?
??? ****************************************************
?
??? 再查看當前DATABASE的該參數:
?
??? SQL > show parameter nls_date_format
???
??? NAME??????????????? TYPE??????? VALUE
??? ------------------- ----------- --------------------
??? nls_date_format?????string
?
??? 發現當前數據庫未設定該參數。
?
?
?
??? ****************************************************
?
??? 由于是系統的啟動參數,不能直接用alter database來修改,所以可以通過修改當前session來暫時實驗一下:
?
??? 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
?
?
?
??? ****************************************************
?
??? 如果需要一直都這樣顯示,則可以 修改注冊表、添加環境變量、直接修改啟動參數文件
?
?
?
-The End-