SQLPLus 与 SQLDeveloper 行为

SQLPLus vs SQLDeveloper behavior

我在 SQLPlus 和 SQL 开发人员之间遇到了不同的行为。

示例数据:

create table test (
  INIT_DATE DATE
);

INSERT INTO test(INIT_DATE) values (sysdate);
COMMIT;

现在我 运行 下面的查询(注意我们正在做一个不必要的 to_date 因为 INIT_DATE 已经是一个日期):

select to_date(INIT_DATE, 'dd/mm/rrrr') from test;

结果是:

我找到了 this answer,所以在 SQLDeveloper 中,我将 NLS>Format Date 更改为 'DD/MM/RR',现在 SQLDeveloper return 20/09/ 16.

但是,如果在 SQLDeveloper 中,我再次将 NLS 更改为 'DD/MM/RR HH24:MI:SS',并将查询掩码更改为 'DD/MM/RR',SQLDeveloper return再次出错:

select to_date(INIT_DATE, 'DD/MM/RR') from test;

使用 TO_CHAR 而不是 TO_DATETO_DATE 函数将第二个参数给出的特定格式的 char 参数转换为日期值。

你的陈述

select to_date(INIT_DATE, 'DD/MM/RR') from test;

首先隐式转换为 char,因为 INIT_DATE 是一个日期。此转换为 nls 默认格式,具体取决于您的机器设置。

您尝试通过 TO_DATE 函数将 DATE 转换为 DATE,但是 TO_DATE 函数参数是字符串,结果 Oracle 将 INIT_DATE 列转换为字符串,然后将此字符串传递给 TO_DATE 函数。

如果您使用隐式转换 'string to date' 或 'date to string' ,那么 Oracle 使用默认的日期格式。不同环境默认日期格式可能不同

尝试使用显式转换和适当的格式。 例如:

select to_date(to_char(INIT_DATE, 'dd/mm/rrrr'), 'dd/mm/rrrr') from test;