NLS_DATE_FORMAT參數(shù)研究
?
?
??? 今天想設(shè)置一下NLS_DATE_FORMAT參數(shù)來更改一下date參數(shù)的輸出格式,之前的 DATE類型默認(rèn)格式的設(shè)置 這篇文章里也談到這個(gè)問題,當(dāng)時(shí)認(rèn)為既然可以用alter
session來做,那么修改DB參數(shù)也是比較方便的,其實(shí)不然,具體可以看一下下文:
?
??? 首先看當(dāng)前的格式:
?
SQL> select sysdate from dual;
?
SYSDATE
---------
07-NOV-08
?
??? 剛開始SPFILE里沒有配置NLS_DATE_FORMAT參數(shù)的,用了ALTER SYSTEM ... SCOPE=SPFILE居然報(bào)錯(cuò):
?
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
?
?
??? 在查閱文檔后,發(fā)現(xiàn)這個(gè)參數(shù)確實(shí)不能通過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,加進(jìn)了NLS_DATE_FORMAT參數(shù):
?
SQL> select name,value,isspecified from v$spparameter where name='nls_date_format';
?
NAME???????????? VALUE???????? ISSPEC
----------?????? ----------??? -------------------------
nls_date_format? YYYY-MM-DD??? TRUE
?
?
??? 雖然Oracle里的參數(shù)換了,但是查詢后的顯示結(jié)果任然是一樣的:
?
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參數(shù)主要還是受到OS的影響,每次登錄時(shí)會(huì)將OS的NLS_DATE_FORMAT參數(shù)加載進(jìn)去。
??? 基本上除了修改環(huán)境變量就只能通過alter session來修改了,暫時(shí)還沒有找到好一點(diǎn)的辦法。
?
?
??? 要注意并不單是顯示上的問題,而是在內(nèi)部存儲(chǔ)的值也會(huì)被覆蓋:
?
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
?
??? 在沒有修改環(huán)境變量或session參數(shù)時(shí),這個(gè)語(yǔ)句是無法執(zhí)行的。修改后可以執(zhí)行:
?
SQL>
select to_date(to_char(sysdate,'yyyy-mm-dd')) from dual;
?
TO_DATE(TO
----------
2008-11-10
?
?