ORACLE中的DECODE函数没有输出日期01-01-1900。

问题描述 投票:0回答:1

在oracle的项目中,DECODE函数是推荐使用的准则,在转换日期01-01-1900时有一些问题。

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

DECODE函数给我的是2000-01-01而不是1900-01-01.我检查了NLS参数,并通过修改TO_DATE函数中的不同内容进行了尝试。我检查了NLS的参数,并通过修改TO_DATE函数中的不同内容进行了尝试,但没有任何结果。

oracle date oracle-sqldeveloper decode
1个回答
1
投票

有没有可能数据库中的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等)会有他们的 自己 结果的格式化,可以掩盖可能发生的数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.