nls_date_format参数设置的问题

今天在练习TO_DATE()和TO_CHAR()函数的时候发现了一个问题,就是说nls_date_format参数在会话级alter session修改起作用,可在系统级alter system却不起作用.具体情况如下:

 

[php] view plain copy

  1. SQL> select sysdate from dual;  
  2.   
  3. SYSDATE  
  4. ---------------  
  5. 19-OCT-09  
  6. SQL> alter session set nls_date_format="MON-DD-YYYY";  
  7.   
  8. Session altered.  
  9. SQL> select sysdate from dual;  
  10.   
  11. SYSDATE  
  12. -----------------  
  13. OCT-19-2009  
  14.   
  15. SQL>  
  16. ========================================================  
  17. SQL> alter system set nls_date_format="MON-DD-YYYY" scope=spfile;  
  18.   
  19. System altered.  
  20.   
  21. SQL> shutdown immediate  
  22. Database closed.  
  23. Database dismounted.  
  24. ORACLE instance shut down.  
  25. SQL> startup  
  26. ORACLE instance started.  
  27.   
  28. Total System Global Area  176160768 bytes  
  29. Fixed Size                  1247948 bytes  
  30. Variable Size              92276020 bytes  
  31. Database Buffers           79691776 bytes  
  32. Redo Buffers                2945024 bytes  
  33. Database mounted.  
  34. Database opened.  
  35. SQL> show parameter date  
  36. NAME                                 TYPE        VALUE  
  37. ------------------------------------ ----------- ------------------------------  
  38. fixed_date                           string  
  39. nls_date_format                      string      MON-DD-YYYY  
  40. nls_date_language                    string  
  41.   
  42. SQL> select sysdate from dual;  
  43.   
  44. SYSDATE  
  45. ---------------  
  46. 19-OCT-09  
  47.   
  48. SQL>  
  49. 这个时候没有显示OCT-19-2009 而却是19-OCT-09  

 

上网去搜了搜,找到了答案,那就是优先级的关系导致了这个问题.

系统级alter system的优先级低于会话级alter session的优先级,更加详细的情况接下来会演示出来.

 

[php] view plain copy

  1. nls参数、环境变量以及函数起作用的顺序如下(由低到高)  
  2. instance级参数--->nls_lang--->session级参数--->函数  
  3.   
  4.   
  5. C:>set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK  
  6. C:>sqlplus / as sysdba  
  7. SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 7月 29 21:01:38 2009  
  8. Copyright (c) 1982, 2005, Oracle. All rights reserved.  
  9.   
  10. 连接到:  
  11. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production  
  12. With the Partitioning, OLAP and Data Mining options  
  13. SQL> show parameter nls_date_format  
  14. NAME TYPE VALUE  
  15. ------------------------------------ ----------- ------------------------------  
  16. nls_date_format string yyyy/mm/dd hh24:mi:ss  
  17. --很明显实例级别参数nls_date_format没有启作用  
  18. SQL> select sysdate from dual;  
  19. SYSDATE  
  20. --------------  
  21. 29-7月 -09  
  22. --==============================  
  23. --在注册表中清除nls_lang的值,这是我们发现实例级参数nls_date_format:格式  
  24. yyyy/mm/dd hh24:mi:ss开始发挥作用  
  25. SQL> exit  
  26. 从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production  
  27. With the Partitioning, OLAP and Data Mining options 断开  
  28. C:>sqlplus / as sysdba  
  29. SQL*Plus: Release 10.2.0.1.0 - Production on Wed Jul 29 20:54:59 2009  
  30. Copyright (c) 1982, 2005, Oracle. All rights reserved.  
  31.   
  32. ???:  
  33. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production  
  34. With the Partitioning, OLAP and Data Mining options  
  35. SQL> select sysdate from dual;  
  36. SYSDATE  
  37. -------------------  
  38. 2009/07/29 20:55:01  
  39. --====================================  
  40. --恢复注册表中的nls_lang设置:SIMPLIFIED CHINESE_CHINA.ZHS16GBK  
  41. SQL> exit  
  42. ? Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production  
  43. With the Partitioning, OLAP and Data Mining options ??  
  44. C:>sqlplus / as sysdba  
  45. SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 7月 29 20:55:21 2009  
  46. Copyright (c) 1982, 2005, Oracle. All rights reserved.  
  47.   
  48. 连接到:  
  49. Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production  
  50. With the Partitioning, OLAP and Data Mining options  
  51. SQL> select sysdate from dual;  
  52. SYSDATE  
  53. --------------  
  54. 29-7月 -09  
  55. SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';  
  56. 会话已更改。  
  57. --显然session级别的nls_date_format发挥了作用  
  58. SQL> select sysdate from dual;  
  59. SYSDATE  
  60. -------------------  
  61. 2009-07-29 20:55:55  
  62. --很显然函数发挥了作用  
  63. SQL> select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;  
  64. TO_CHAR(SYSDATE,'YY  
  65. -------------------  
  66. 2009-07-29 09:10:01  
  67. SQL>  

这下就清楚了,呵呵.

### 修改 Oracle 数据库中的 `NLS_DATE_FORMAT` 参数 `NLS_DATE_FORMAT` 是 Oracle 数据库中用于控制日期类型(DATE)的默认显示和输入格式的参数。修改该参数可以影响数据库会话中的日期格式,但需要注意其作用范围(实例级别、会话级别、客户端环境等)。 #### 1. **修改会话级别的 `NLS_DATE_FORMAT`** 在 SQL*Plus 或 SQL Developer 等工具中,可以通过以下语句修改当前会话的日期格式: ```sql ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; ``` 此修改仅对当前会话有效,会话结束后将失效[^3]。 #### 2. **在 `glogin.sql` 文件中设置全局默认格式** 为了使所有会话默认使用特定的日期格式,可以在 `$ORACLE_HOME/sqlplus/admin/glogin.sql` 文件中添加以下语句: ```sql ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'; ``` 这样,每次启动 SQL*Plus 时都会自动应用该格式[^3]。 #### 3. **通过客户端环境变量 `NLS_LANG` 设置** 如果设置了客户端环境变量 `NLS_LANG`,则会话的 `NLS_DATE_FORMAT` 将继承客户端的设置。如果未设置 `NLS_DATE_FORMAT`,则默认使用 `DD-MON-YY` 格式。 例如,在 Linux 系统中,可以在终端中设置: ```bash export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 ``` 在 Windows 系统中,可以在注册表中设置 `NLS_LANG`: ``` HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<Oracle_Home_Name> ``` 添加字符串值 `NLS_LANG`,并设置为 `AMERICAN_AMERICA.AL32UTF8`[^2]。 #### 4. **修改数据库实例级别的 `NLS_DATE_FORMAT`** 要修改数据库实例级别的 `NLS_DATE_FORMAT`,需要在初始化参数文件(`init.ora` 或 `spfile`)中设置: ```ini NLS_DATE_FORMAT='YYYY-MM-DD' ``` 然后重启数据库实例以使更改生效: ```sql SHUTDOWN IMMEDIATE; STARTUP; ``` 注意:此方法通常不推荐,因为大多数情况下应通过客户端或会话级设置来控制日期格式[^2]。 #### 5. **通过 JDBC 设置会话级别的 `NLS_DATE_FORMAT`** 在使用 JDBC 连接 Oracle 数据库时,可以通过连接字符串或执行 SQL 语句来设置会话级别的 `NLS_DATE_FORMAT`。 ##### 方法一:在连接后执行 SQL ```java Connection conn = DriverManager.getConnection(url, username, password); Statement stmt = conn.createStatement(); stmt.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS'"); ``` ##### 方法二:通过连接属性设置 某些 JDBC 驱动支持在连接 URL 中指定 NLS 参数,例如: ```java jdbc:oracle:thin:@//host:port/service_name?internal_logon=as SYSDBA&oracle.jdbc.timezoneAsRegion=false ``` 但 `NLS_DATE_FORMAT` 通常需要在连接后通过 SQL 设置[^4]。 #### 6. **Windows 注册表设置** 在 Windows 系统中,可以通过注册表设置 `NLS_DATE_FORMAT`: ``` HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<Oracle_Home_Name> ``` 添加字符串值 `NLS_DATE_FORMAT`,并设置为 `YYYY-MM-DD`。 但需要注意,如果 `NLS_LANG` 未设置,或者某些工具(如 SQL Developer)未继承注册表设置,可能会导致格式未生效[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值