在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函数中的不同内容进行了尝试,但没有任何结果。
有没有可能数据库中的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等)会有他们的 自己 结果的格式化,可以掩盖可能发生的数据类型。