ORACLE中的解码函数未将日期01-01-1900作为输出
在我们项目中的oracle中,解码功能是建议使用它们的指南,在转换日期01-01-1900时会出现问题。 考虑下面的解码< /P>ORACLE中的解码函数未将日期01-01-1900作为输出,oracle,date,oracle-sqldeveloper,decode,Oracle,Date,Oracle Sqldeveloper,Decode,在我们项目中的oracle中,解码功能是建议使用它们的指南,在转换日期01-01-1900时会出现问题。 考虑下面的解码< /P> CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE) - (The CAST is also a mandatory guideline) If, COL1 DATECOL A 2019-04-05 B 2018-01-01 C 2020-05-01 我得到的
CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE) - (The CAST is also a mandatory guideline)
If,
COL1 DATECOL
A 2019-04-05
B 2018-01-01
C 2020-05-01
我得到的结果数据如下所示
COL1 OUTPUT
A 2019-04-05
B 2000-01-01
C 2000-01-01
解码功能给出的是2000-01-01,而不是1900-01-01。
我已经检查了NLS参数,并在TO_DATE函数中修改了不同的内容。没有任何结果。数据库中的DATECOL是否可能实际上是一个字符串?因为如果是这种情况,那么DECODE总是使用第一个潜在的返回项来设置数据类型。一旦你开始混合和匹配数据类型,坏事情就会发生 比如说
SQL> alter session set nls_date_format = 'YY-MM-DD';
Session altered.
SQL> with t as
2 ( select 'A' col1, '2010-01-01' datecol from dual union all
3 select 'B' col1, '2010-01-01' datecol from dual )
4 select CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE)
5 from t;
CAST(DEC
--------
10-01-01
00-01-01
看起来还可以,但是如果我深入研究在所有的数据类型跳转之后实际返回的值
SQL> with t as
2 ( select 'A' col1, '2010-01-01' datecol from dual union all
3 select 'B' col1, '2010-01-01' datecol from dual )
4 select to_char(CAST(DECODE(COL1,'A',DATECOL,TO_DATE('01011900','DDMMYYYY')) AS DATE),'dd-mm-yyyy')
5 from t;
TO_CHAR(CA
----------
01-01-2010
01-01-2000
您可以看到,缺少一个完整的世纪规范已经“破坏”了结果。特别是,您正在使用的工具(SQL Developer和其他工具)将有自己的结果格式,可以掩盖数据类型可能发生的情况。这是您的真实代码吗?它应该有用。对我有用:好的,我同意。不过,若DATECOL列的数据类型是DATE,为什么要再次将其强制转换为DATE?这就足够了:
解码(COL1,'A',DATECOL,DATE'1900-01-01')