【问题标题】:Issue with NLS_DATE_FORMATNLS_DATE_FORMAT 问题
【发布时间】:2017-02-22 06:48:25
【问题描述】:

为什么我在下面看到不同的日期格式:查看 select 语句的输出和匿名块的输出

13:46:23 13:46:23  SQL> conn prashant-mishra/ *****@*****

Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 

13:47:56 13:47:56  SQL> CREATE TABLE test AS SELECT SYSDATE as test_date 
                        FROM dual;
Table created


13:48:15 13:48:15  SQL> SELECT test_date FROM test;
                   TEST_DATE
                   -----------
                   **10/13/2016**

13:50:17 13:50:17  SQL> BEGIN
                   2    FOR rec IN (SELECT test_date FROM test) LOOP
                   3      dbms_output.put_line(rec.test_date);
                   4    END LOOP;
                   5  END;
                   6  /

**13-OCT-16**
PL/SQL procedure successfully completed

其他有用的信息可能是:

13:50:20 13:50:20  SQL> SELECT value FROM v$nls_parameters 
                        WHERE parameter ='NLS_DATE_FORMAT';
            VALUE
            ----------------------------------------------------------------
            DD-MON-RR


13:50:45 13:50:45  SQL> SELECT SYSDATE FROM dual;
            SYSDATE
            -----------
            **10/13/2016**

【问题讨论】:

  • 匿名块可能使用与 SQL*Plus 会话不同的 NLS 设置(dbms_output 调用中的隐式 TO_CHAR 转换)。请检查 nls_session_parametersnls_database_parameters 以了解可能解释您所看到行为的任何差异。
  • @MartinSchapendonk:我看不出有什么不同。 select * from NLS_DATABASE_PARAMETERS WHERE parameter ='NLS_DATE_FORMAT' ;--DD-MON-RR SELECT * FROM NLS_SESSION_PARAMETERS WHERE parameter ='NLS_DATE_FORMAT';--DD-MON-RR
  • 当您使用alter session set NLS_DATE_FORMAT = 'DD-MON-RR'; 显式更改会话之前 执行时,匿名块的输出是什么?
  • 哪个数据类型得到了test_date列?
  • @WernfriedDomscheit 它是 DATE 类型

标签: sql oracle plsql sqlplus


【解决方案1】:

SQL*Plus 使用NLS_DATE_FORMAT 将日期格式化为字符串,因此完整的测试用例需要预先显示该参数是什么。请您尝试以下方法,看看您是否获得一致的格式:

SQL> select value from nls_session_parameters where parameter = 'NLS_DATE_FORMAT';

VALUE
----------------------------------------------------------------
DD-MON-RR

SQL> select sysdate from dual;

SYSDATE
------------------
13-OCT-16

SQL> alter session set nls_date_format = 'YYYY-MM-DD';

Session altered.

SQL> select sysdate from dual;

SYSDATE
----------
2016-10-13

SQL> alter session set nls_date_format = 'DD-MON-RR';

Session altered.

SQL> select sysdate from dual;

SYSDATE
------------------
13-OCT-16

SQL>

根据您的 cmets,您将获得以下输出:

SQL> select value from nls_session_parameters where parameter = 'NLS_DATE_FORMAT';
VALUE
DD-MON-RR

SQL> select sysdate from dual;
SYSDATE 
10/14/2016

SQL> alter session set nls_date_format = 'YYYY-MM-DD';
Session altered

SQL> select sysdate from dual; 
SYSDATE
10/14/2016

SQL> alter session set nls_date_format = 'DD-MON-RR';
Session altered 

SQL> select sysdate from dual;
SYSDATE 
10/14/2016

所以 - SQLPlus 忽略会话 NLS_DATE_FORMAT 并使用它的唯一本地格式 MM/DD/YYYY。我认为 SQL*Plus 中没有日期格式覆盖,但可能是错误的。您是否在不同的客户端中尝试过相同的命令?

【讨论】:

  • 13:05:38 13:05:38 SQL> 从 nls_session_parameters where parameter = 'NLS_DATE_FORMAT' 中选择值; VALUE DD-MON-RR 13:05:50 13:05:50 SQL> select sysdate from dual; SYSDATE 10/14/2016 13:05:56 13:05:56 SQL> 更改会话集 nls_date_format = 'YYYY-MM-DD';会话更改 13:06:04 13:06:04 SQL> select sysdate from dual; SYSDATE 10/14/2016 13:06:08 13:06:08 SQL> 更改会话集 nls_date_format = 'DD-MON-RR';会话更改 13:06:20 13:06:20 SQL> select sysdate from dual;日期 2016 年 10 月 14 日
猜你喜欢
  • 2016-08-07
  • 2020-05-23
  • 2021-10-25
  • 1970-01-01
  • 2013-08-26
  • 2014-05-16
  • 2019-01-08
  • 2023-04-04
  • 2015-01-23
相关资源
最近更新 更多