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
?
?