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
          主站蜘蛛池模板: 泰来县| 锦州市| 丹东市| 海门市| 贵港市| 时尚| 砀山县| 荥经县| 长兴县| 禄丰县| 依安县| 北宁市| 灌云县| 萝北县| 岱山县| 昔阳县| 孟连| 图们市| 福泉市| 陕西省| 阜康市| 若羌县| 汝阳县| 北宁市| 渝北区| 罗田县| 平山县| 潞西市| 三河市| 麻栗坡县| 清流县| 津市市| 承德县| 长治市| 当阳市| 桑日县| 邵武市| 万安县| 大英县| 南丹县| 沈丘县|