時間格式nls_date_format的設定

eric0435發表於2015-02-04

nls_date_format引數用於設定日期顯示格式,設定的方式有多種,不同的方式也會帶來不同的結果。引數的設定是有優先順序的,日期格式的引數設定也不例外。優先順序如下(低到高):初始化引數 < 系統環境變數 < 會話級(session)< 函式
下面來演示引數設定的優先順序
1.用初始化引數來設定nls_date_format
檢查是否設定了nls_date_format環境變數,從下面的結果可知並沒有設定

[oracle@oracle11g ~]$ export nls_date_format
SQL>show parameter nls_date_format

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_date_format                      string

修改引數nls_date_format

SQL> alter system set nls_date_format='yyyy-mm-dd hh24:mi:ss' scope=spfile;

System altered.

SQL> shutdow immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  327155712 bytes
Fixed Size                  1273516 bytes
Variable Size             138412372 bytes
Database Buffers          184549376 bytes
Redo Buffers                2920448 bytes
Database mounted.
Database opened.
SQL> show parameter nls_date_format

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_date_format                      string      yyyy-mm-dd hh24:mi:ss

SQL> select sysdate from dual;

SYSDATE
------------
04-FEB-15

在修改引數nls_date_format後,我們查詢系統時間並沒有以'yyyy-mm-dd hh24:mi:ss'這種格式顯式,因為NLS_LANG環境變數同樣會影響到nls_date_format引數,只要存在NLS_LANG環境變數,Oracle就會使用環境變數的值(即使nls_date_format),根據上面我們提到的優先順序,所以初始化引數檔案設定的值會被忽略,但由於環境變數中nls_date_format並沒有設定,所以Oracle還是使用了預設的格式。

現在設定NLS_LANG環境變數

[oracle@oracle11g ~]$ export NLS_LANG
[oracle@oracle11g ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 4 10:00:05 2015

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter nls_date_format

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_date_format                      string      yyyy-mm-dd hh24:mi:ss
SQL> select sysdate from dual;

SYSDATE
-------------------
2015-02-04 10:01:26

從上面的結果可以看到當我們去掉環境變數nls_lang後,查詢系統時間就是以初始化引數nls_date_format的格式(yyyy-mm-dd hh24:mi:ss)來顯示的

2.我們將引數nls_date_format設定為'yyyy-mm-dd hh24:mi:ss',將環境變數設定為'yy-mm-dd hh24:mi:ss'來觀察它們的優先順序

[oracle@oracle11g ~]$ export nls_date_format='yy-mm-dd hh24:mi:ss'
[oracle@oracle11g ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 4 09:44:07 2015

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter nls_date_format

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_date_format                      string      yyyy-mm-dd hh24:mi:ss
SQL> select sysdate from dual;

SYSDATE
-----------------
15-02-04 09:44:31

可以看到查詢系統時間以是環境變數所設定的格式('yy-mm-dd hh24:mi:ss')來顯示的。這就說明nls_date_format在環境變數中的設定比初始化引數的優先順序高。

3.我們將引數nls_date_format設定為'yyyy-mm-dd hh24:mi:ss',環境變數設定為'yy-mm-dd hh24:mi:ss',並在會話級將nls_date_format設定為'dd-mm-yy hh24:mi:ss'

[oracle@oracle11g ~]$ export nls_date_format='yy-mm-dd hh24:mi:ss'
[oracle@oracle11g ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 4 09:44:07 2015

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


SQL> alter session set nls_date_format='dd-mm-yy hh24:mi:ss';

Session altered.

SQL> show parameter nls_date_format

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_date_format                      string      yyyy-mm-dd hh24:mi:ss
SQL> select sysdate from dual;

SYSDATE
-----------------
04-02-15 09:50:01

從上面的結果可以看到查詢系統時間是以會話級引數nls_date_format的格式(='dd-mm-yy hh24:mi:ss')來顯示的,這就說明了nls_date_format引數的優先順序為:會話級>環境變數>初始化引數

4.我們將引數nls_date_format設定為'yyyy-mm-dd hh24:mi:ss',環境變數設定為'yy-mm-dd hh24:mi:ss',並在會話級將nls_date_format設定為'dd-mm-yy hh24:mi:ss',使用函式來轉換日期格式為'mm-dd-yy hh24:mi:ss'

[oracle@oracle11g ~]$ export nls_date_format='yy-mm-dd hh24:mi:ss'
[oracle@oracle11g ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.5.0 - Production on Wed Feb 4 09:44:07 2015

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


SQL> alter session set nls_date_format='dd-mm-yy hh24:mi:ss';

Session altered.

SQL> show parameter nls_date_format

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_date_format                      string      yyyy-mm-dd hh24:mi:ss

SQL> select to_char(sysdate,'mm-dd-yy hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'
-----------------
02-04-15 10:11:44

從上面的結果可以看到函式的優先順序最高,這就證明了日期格式的優先順序為:初始化引數 < 系統環境變數 < 會話級(session)< 函式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-1426649/,如需轉載,請註明出處,否則將追究法律責任。

相關文章