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;
结果是:
- SQL加上 => Return 2016 年 9 月 20 日
- SQL开发人员 => 抛出 ORA-01861
我找到了 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;
- 谁能解释这种行为?
- 为什么 SQL开发人员在查询掩码为 'DD/MM/RR' 时会抛出错误,而在 NLS 为 'DD/MM/RR' 时却不会抛出错误?
使用 TO_CHAR
而不是 TO_DATE
。 TO_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;
我在 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;
结果是:
- SQL加上 => Return 2016 年 9 月 20 日
- SQL开发人员 => 抛出 ORA-01861
我找到了 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;
- 谁能解释这种行为?
- 为什么 SQL开发人员在查询掩码为 'DD/MM/RR' 时会抛出错误,而在 NLS 为 'DD/MM/RR' 时却不会抛出错误?
使用 TO_CHAR
而不是 TO_DATE
。 TO_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;