Oracle SQLPLus与SQLDeveloper行为

Oracle SQLPLus与SQLDeveloper行为,oracle,oracle-sqldeveloper,sqlplus,Oracle,Oracle Sqldeveloper,Sqlplus,我在SQLPlus和sqldeveloper之间遇到了不同的行为 示例数据: create table test ( INIT_DATE DATE ); INSERT INTO test(INIT_DATE) values (sysdate); COMMIT; 现在我运行以下查询(注意,我们正在执行一个不必要的to_日期,因为INIT_日期已经是一个日期): 结果是: SQLPlus=>返回日期2016年9月20日 SQLDeveloper=>抛出ORA-01861 我发现,所以在S

我在SQLPlus和sqldeveloper之间遇到了不同的行为

示例数据:

create table test (
  INIT_DATE DATE
);

INSERT INTO test(INIT_DATE) values (sysdate);
COMMIT;
现在我运行以下查询(注意,我们正在执行一个不必要的to_日期,因为INIT_日期已经是一个日期):

结果是:

  • SQLPlus=>返回日期2016年9月20日
  • SQLDeveloper=>抛出ORA-01861
我发现,所以在SQLDeveloper中,我将NLS>格式日期更改为'DD/MM/RR',现在SQLDeveloper返回20/09/16

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

select to_date(INIT_DATE, 'DD/MM/RR') from test;
  • 有人能解释这种行为吗
  • 如果查询掩码为'DD/MM/RR',而NLS为'DD/MM/RR',为什么SQLDeveloper会抛出错误

使用
到字符
而不是
到日期
TO_DATE
函数将第二个参数给定的特定格式的字符参数转换为日期值

你的陈述

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

第一次隐式转换为字符,因为INIT_DATE是一个日期。此转换为nls默认格式,具体取决于您的计算机设置。

您尝试通过to_DATE函数将日期转换为日期,但to_DATE函数参数是字符串,因此Oracle将INIT_DATE列转换为字符串,然后将此字符串传递给to_DATE函数

如果使用隐式转换“字符串到日期”或“日期到字符串”,则Oracle使用默认的日期格式。在不同的环境中,默认日期格式可能不同

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


从测试中选择至日期(至字符(起始日期,'dd/mm/rrrrr'),'dd/mm/rrr')

如果该列已具有日期类型,为什么要尝试通过TO_DATE函数将INIT_DATE列转换为日期类型?此转换是错误的。事实上,在生产中安装了带有此错误的物化视图,因为它是使用SQLPlus执行的,但现在无法使用SQLDeveloper重新安装。我想了解SQLPlus和SQLDeveloper之间的区别,所以我准备了这些测试;然后意识到这是传递给to_date()调用的字符串。
select to_date(INIT_DATE, 'DD/MM/RR') from test;