【问题标题】:DECODE function in ORACLE does not give date 01-01-1900 as outputORACLE 中的 DECODE 函数没有给出日期 01-01-1900 作为输出
【发布时间】:2020-05-26 09:00:27
【问题描述】:

在我们项目中推荐使用 DECODE 函数的 oracle 中,转换日期 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 函数中的不同内容来涉猎。什么都没解决。

【问题讨论】:

  • 这是你的真实代码吗?它应该可以工作。
  • 为我工作:dbfiddle.uk/…
  • 工作正常,我同意。但是,如果 DATECOL 列的数据类型是 DATE,为什么还要将它转换为 DATE?这就够了:DECODE(COL1, 'A', DATECOL, DATE '1900-01-01')

标签: oracle date oracle-sqldeveloper decode


【解决方案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 和其他工具)将有自己的自己的结果格式,可以掩盖数据类型可能发生的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多