NLS_DATE_FORMAT参数详解

本文介绍了在Oracle数据库中设置日期格式的多种方式,并详细探讨了不同设置之间的优先级关系。包括初始化参数、环境变量、会话级参数及函数级别的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题的引出

NLS_DATE_FORMAT参数用于设置日期显示格式,设置的方式有多种,不同的方式也会带来不同的结果。

我们知道,参数的设置是有优先级的,日期格式的参数设置也不例外。优先级如下(低到高):

● 初始化参数 < 系统环境变量 < 会话级(session)< 函数

我们先来查看系统默认的日期显示方式:

SQL> select sysdate from dual;

SYSDATE

--------------

31-DEC-12

下面我们通过几种设置方式来对NLS_DATE_FORMAT参数进行修改。

二、初始化参数设置

查看该参数的值:

SQL> show parameter nls_date_format

NAME                                TYPE                            VALUE

------------------------------------ --------------------------------------------------------------

nls_date_format                     string

可以看到,未设置时,value为空,即使用系统默认设置,也可以通过以下方式查看:

SQL> select name,value,isspecified fromv$spparameter where name='nls_date_format';

NAME                          VALUE                    ISSPECIFIED

------------------------------ --------------------------------------------------

nls_date_format                                          FALSE

对于初始化参数的设置其实也有几种方式。

2.1、修改init$ORACLE_SID.ora文件

● 方法一:在初始化参数文件中追加:

[oracle@localhostdbs]$ vi init$ORACLE_SID.ora

NLS_DATE_FORMAT='yyyy-Month-dd'

因为初始化参数文件只有在启动数据库的时候才被载入,所以我们要重启数据库,如果存在spfile.ora文件,则要在关闭数据库的时候重建spfile文件。

关闭数据库:

SQL> shutdown immediate

Database closed.

Databasedismounted.

ORACLE instanceshut down.

创建(或重建)spfile文件:

SQL> create spfile from pfile;

File created.

启动数据库:

SQL> startup

ORACLE instancestarted.

 

Total SystemGlobal Area  524288000 bytes

Fixed Size                  2022080 bytes

VariableSize             180356416 bytes

DatabaseBuffers          339738624 bytes

RedoBuffers                2170880 bytes

Databasemounted.

Database opened.

重新查询参数设置情况:

SQL> show parameter nls_date_for

NAME                                TYPE                            VALUE

------------------------------------ --------------------------------------------------------------

nls_date_format                     string                          yyyy-Month-dd

 

SQL> select name,value,isspecified fromv$spparameter where name='nls_date_format';

NAME                 VALUE                ISSPECIFIED

-------------------- -------------------- --------------------

nls_date_format     yyyy-Month-dd        TRUE

查询当前系统时间,发现时间显示格式已经生效了:

SQL> select sysdate from dual;

SYSDATE

-----------------

2012-December -31

当然,如果存在spfile文件,也可使用ALTERSYSTEM语句动态修改,但修改后同样需要重启数据库。

● 方法二:动态修改spfile文件

SQL> alter system setNLS_DATE_FORMAT='yyyy:mm:dd' scope=spfile;

System altered.

关闭数据库:

SQL> shutdown immediate

Database closed.

Databasedismounted.

ORACLE instanceshut down.

这里可以顺便根据spfile内容来创建pfile文件:

SQL> create pfile from spfile;

File created.

启动数据库:

SQL> startup

ORACLE instancestarted.

 

Total SystemGlobal Area  524288000 bytes

Fixed Size                  2022080 bytes

VariableSize             180356416 bytes

DatabaseBuffers          339738624 bytes

RedoBuffers                2170880 bytes

Database mounted.

Database opened.

测试,查询日期:

SQL> select sysdate from dual;

SYSDATE

--------------

2012:12:31

2.2、修改环境变量

修改环境变量不需要重启数据库,只需要使环境变量生效即可。

我们现在只在环境变量文件追加以下内容,看看结果怎样:

[oracle@redhat4~]$ vi .bash_profile

export NLS_LANG=AMERICAN_AMERICA.zhs16gbk

[oracle@redhat4~]$ source .bash_profile

我们可以发现,现在系统的时间显示格式又恢复到了默认,这是为什么呢?

因为NLS_LANG参数同样会影响到NLS_DATE_FORMAT参数,只要存在NLS_LANG参数,Oracle就会使用环境变量的值(即使NLS_DATE_FORMAT),根据上面我们提到的优先级,所以初始化参数文件设置的值会被忽略,但由于环境变量中NLS_DATE_FORMAT并没有设置,所以Oracle还是使用了默认的格式。

SQL> select sysdate from dual;

SYSDATE

------------

31-DEC-12

下面我们把NLS_DATE_FORMAT也设置上去,追加:

[oracle@redhat4~]$ vi .bash_profile

exportNLS_DATE_FORMAT='yyyy-mm-dd HH24:MI:SS'

[oracle@redhat4~]$ source .bash_profile

查询系统时间:

SQL> select sysdate from dual;

SYSDATE

-------------------------

2012-12-3101:47:57

 

2.3、修改会话级参数

如果修改会话级参数,则会忽略前面所修改的值,但会话级设置的值也只有在此会话中有效。

SQL> alter session setNLS_DATE_FORMAT='HH24:MI:SS dd/mm/yyyy';

Session altered.

 

SQL> select sysdate from dual;

SYSDATE

-------------------------

01:53:0031/12/2012

2.4、函数中改变日期格式

函数修改的级别最高,但只是在此次函数结果中生效。

SQL> select to_char(sysdate,'fmDdspth"of" Month Year fmHH:MI:SS AM') "Date" from dual;

Date

---------------------------------------------------------------------------

Thirty-First ofDecember Twenty Twelve 02:02:19 AM

 

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值