Decode360's Blog

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          ??? 今天想設置一下NLS_DATE_FORMAT參數來更改一下date參數的輸出格式,但是遇到了問題:
          ?
          SQL> select sysdate from dual;
          ?
          SYSDATE
          ---------
          07-NOV-08

          ?
          ??? 剛開始SPFILE里沒有配置NLS_DATE_FORMAT參數的,用了ALTER SYSTEM ... SCOPE=SPFILE居然報錯:
          ?
          SQL> alter system set nls_date_format='YYYY-MM-DD' scope=spfile;
          ?
          alter system set nls_date_format='YYYY-MM-DD' scope=spfile
          ?
          ORA-02096: specified initialization parameter is not modifiable with this option
          ?
          ?
          ?
          ??? 但是使用ALTER SESSION是可以的:
          ?
          SQL> alter session set nls_date_format='yyyy-mm-dd';
          ?
          Session altered.
          ?
          SQL> select sysdate from dual;
          ?
          SYSDATE
          ----------
          2008-11-07
          ?
          ?
          ??? 在查閱文檔后,發現這個參數確實不能通過ALTER SYSTEM命令來修改:
          ?
          You can alter the default value of NLS_DATE_FORMAT by:
          ■ Changing its value in the initialization parameter file and then restarting the
          instance
          ■ Using an ALTER SESSION SET NLS_DATE_FORMAT statement
          ?????????????????????? --《Globalization Support Guide》
          ?
          ?
          ??? 修改了SPFILE,加進了NLS_DATE_FORMAT參數:
          ?
          SQL> select name,value,isspecified from v$spparameter where name='nls_date_format';
          ?
          NAME???????????? VALUE???????? ISSPEC
          ----------?????? ----------??? -------------------------
          nls_date_format? YYYY-MM-DD??? TRUE
          ?
          ?
          ??? 雖然Oracle里的參數換了,但是查詢后的顯示結果任然是一樣的:
          ?
          SQL> select sysdate from dual;
          ?
          SYSDATE
          ---------
          07-NOV-08

          ?
          ??? 在HKEY_LOCAL_MACHINE-SOFTWARE-ORACLE-HOME0中加入NLS_DATE_FORMAT鍵值后,查詢正常:
          ?
          SQL> select sysdate from dual;
          ?
          SYSDATE
          ----------
          2008-11-07
          ?
          ?
          ??? 看來NLS_DATE_FORMAT參數主要還是受到OS的影響,每次登錄時會將OS的NLS_DATE_FORMAT參數加載進去。
          ??? 基本上除了修改環境變量就只能通過alter session來修改了,暫時還沒有找到好一點的辦法。
          ?
          ?
          ??? 要注意并不單是顯示上的問題,而是在內部存儲的值也會被覆蓋:
          ?
          SQL> select to_date(to_char(sysdate,'yyyy-mm-dd')) from dual;
          select to_date(to_char(sysdate,'yyyy-mm-dd')) from dual
          ?????????????? *
          ERROR at line 1:
          ORA-01861: literal does not match format string
          ?
          ??? 在沒有修改環境變量或session參數時,這個語句是無法執行的。修改后可以執行:
          ?
          SQL> select to_date(to_char(sysdate,'yyyy-mm-dd')) from dual;
          ?
          TO_DATE(TO
          ----------
          2008-11-10




          -The End-

          posted on 2008-11-02 19:58 decode360-3 閱讀(1418) 評論(1)  編輯  收藏 所屬分類: Oracle

          評論

          # re: NLS_DATE_FORMAT參數[未登錄] 2009-12-20 20:31 Frank
          呵呵,樓主搞混了
          其實nls_date_format參數(也包括其他nls_參數)是分服務器端和客戶端的.

          樓主想要獲得查詢的格式是yyyy-mm-dd,那么只有alter session和修改windows鍵值是其作用的.修改oracle啟動參數是與查詢無關的,那是數據庫表內date類型插入需要的格式.  回復  更多評論
            

          主站蜘蛛池模板: 塔河县| 宁安市| 彝良县| 贵定县| 格尔木市| 黄龙县| 仲巴县| 绥芬河市| 蓝田县| 南开区| 随州市| 油尖旺区| 临武县| 铜川市| 泰州市| 中方县| 噶尔县| 大渡口区| 东丽区| 铜川市| 南漳县| 龙门县| 万年县| 邢台市| 大厂| 佛坪县| 兴宁市| 盘山县| 黄大仙区| 会同县| 甘德县| 双峰县| 克拉玛依市| 会理县| 常熟市| 兴义市| 华蓥市| 土默特左旗| 特克斯县| 安丘市| 若尔盖县|