NLS_DATE_FORMAT参数

   今天想设置一下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

    WINDOWS系统,要修改注册表,machine/software/oracle/home0里把nls_date_format的值改成yyyy-mm-dd,没有的话就新建一个字符串值(linux中,在.bash_profile中加入export NLS_DATE_FORMAT,Windows也可以设置环境变量),查询正常:

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

注:把参数NLS_DATE_FORMAT设置成yyyy-mm-dd,查询的过滤条件中date类型的字段就可以跟日期控件生成的时间字符串直接比较了,非常方便的,如果对查询速度要求高,可以给日期类型的字段创建一个基于函数的索引。

两种方式:设置环境变量;修改注册表。

你可能感兴趣的:(oracle,sql,linux,OS,bash)