Decode360's Blog

          業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          DATE類型默認格式的設置
          ?
          ??? 今天在工作中發現一個問題,同樣的代碼在同事的機子上可以執行,在我的機子上報錯。在分析了之后,發現是date類型數據的默認格式問題引起的。到網上查了一下,發現遇到這個問題的人算是不少,但是能說清楚的也沒幾個人,所以專門研究了一下這個問題,基本上得到了答案,具體的過程如下:
          ?
          ?
          ??? 首先把問題重現一下,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
          ?
          ?
          ??? 如果需要一直都這樣顯示,則可以修改注冊表、添加環境變量,或直接修改啟動參數文件。
          ?
          ?
          ?
          posted on 2008-10-28 23:12 decode360 閱讀(2590) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
          主站蜘蛛池模板: 灌云县| 颍上县| 清新县| 屯门区| 全椒县| 青海省| 武功县| 桑植县| 江华| 扎兰屯市| 蓝山县| 康平县| 安义县| 泰和县| 瑞昌市| 淄博市| 太仓市| 汝州市| 沭阳县| 桑植县| 丽水市| 樟树市| 三江| 内江市| 垦利县| 施秉县| 上犹县| 屯门区| 南汇区| 平利县| 垣曲县| 刚察县| 晋城| 潢川县| 和硕县| 泸水县| 顺义区| 西藏| 山东| 始兴县| 儋州市|