Decode360's Blog

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          NLS_DATE_FORMAT參數研究
          ?
          ?
          ??? 今天想設置一下NLS_DATE_FORMAT參數來更改一下date參數的輸出格式,之前的 DATE類型默認格式的設置 這篇文章里也談到這個問題,當時認為既然可以用alter session來做,那么修改DB參數也是比較方便的,其實不然,具體可以看一下下文:
          ?
          ??? 首先看當前的格式:
          ?
          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
          ?
          ?
          posted on 2008-11-02 19:58 decode360 閱讀(927) 評論(0)  編輯  收藏 所屬分類: 07.Oracle
          主站蜘蛛池模板: 英山县| 屏东县| 沈丘县| 和林格尔县| 汉寿县| 南和县| 鱼台县| 本溪| 商城县| 通江县| 高雄市| 托克逊县| 萍乡市| 垦利县| 济阳县| 建德市| 屯门区| 洛扎县| 鱼台县| 柳河县| 旬邑县| 清新县| 乐亭县| 双流县| 芮城县| 南宁市| 苏尼特左旗| 扶沟县| 安新县| 南漳县| 常熟市| 仁怀市| 闵行区| 石渠县| 临城县| 吴江市| 玉环县| 东海县| 磐石市| 乌海市| 平定县|