【问题标题】:Subtracting Dates ORA 01722减去日期 ORA 01722
【发布时间】:2020-06-10 16:07:25
【问题描述】:

我试图减去两个日期并得到一个integer 值作为回报。我似乎遇到了障碍,因为两个日期之一为空,随后返回错误。有什么解决方法吗,如果 review_date 为空,我渴望得到aging_date。

select to_date(sysdate)aging_date,to_char(review_date,'MM/DD/YYYY')review_date
from mytable    

aging_date           review_date
2/26/2020             01/05/2020
2/26/2020             05/15/2018
2/26/2020                
2/26/2020             03/14/2019
2/26/2020             12/17/2019

select aging_date,review_date,(aging_date - review_date)actual_date from
(
select 
to_date(sysdate)aging_date,to_char(review_date,'MM/DD/YYYY')review_date, 
(aging_date - review_date)actual_date from mytable
)new

ORA 01722: Invalid Number

【问题讨论】:

  • @TDuong,问题是 review_date 列中有NULL
  • SYSDATE 是一个日期,因此不需要to_date() 转换。同样,根据您的评论, REVIEW_DATE 显然是一个字符串,因此不需要 to_char() 转换。如果您刚刚发布了mytable 的 DDL(或它的编辑测试用例版本),这不是更简单,更不会让所有人感到困惑吗?
  • 但是sysdate不返回时间戳数据类型吗?
  • @JakeWagner - 否:"The data type of the returned value is DATE"。但即使你有一个时间戳——比如来自systimestamp——你也不会使用to_date()来转换它,你会用cast()它。

标签: sql oracle


【解决方案1】:

目标是选择老化日期、审核日期和difference = (aging_date - review_date)。查询选择aging_date 和审核日期,对于日期差异,case 语句仅在aging_datereview_date 不是null 时计算差异。您也可以在这里使用if - end if 块代替大小写:

select 
aging_date,
review_date,
(case when aging_date is not null and review_date is not null then (aging_date - review_date) end )actual_date  
from mytable;

【讨论】:

  • 目标是选择老化日期、审核日期和差=(aging_date - review_date)。查询选择aging_date 和review 日期,对于日期差异,case 语句仅在aging_date 和review_date 不为空时计算差异。您也可以在这里使用 if - end if 块而不是 case。
【解决方案2】:

您必须将varchar2 列转换为DATE 列。

select aging_date,review_date,
(aging_date - to_date(review_date,'mm/dd/yyyy')) actual_date 
from tab;

AGING_DATE          REVIEW_DAT ACTUAL_DATE
------------------- ---------- -----------
26.02.2020 00:00:00 01/05/2020          52
26.02.2020 00:00:00 05/15/2018         652
26.02.2020 00:00:00                       
26.02.2020 00:00:00 03/14/2019         349
26.02.2020 00:00:00 12/17/2019          71

DATEVARCHAR2 相减得到ORA-01722: invalid number

select aging_date,review_date,
(aging_date - review_date) actual_date 
from tab;

-- fails with
-- ORA-01722: invalid number

-- DDL
CREATE TABLE  TAB
   ("AGING_DATE" DATE, 
    "REVIEW_DATE" VARCHAR2(10)
   )

【讨论】:

    【解决方案3】:

    试试这个。如果没有 review_date 应该返回一个零值(只是从自身中减去aging_date)

    select aging_date,
           review_date,
           (aging_date - nvl(review_date,aging_date)) actual_date from mytable
    

    NVL 函数的文档。

    【讨论】:

    • 感谢@OldProgrammer,不幸的是它仍然返回同样令人讨厌的ORA 01722 错误。
    • aging_date和review_date的数据类型是什么?他们是 DATE 还是其他什么?
    • review_date 有to_char 前缀,aging_date 就是to_date(sysdate) 表示今天的日期。
    • OK 那么表中review_date的数据类型是什么???你省略了一些我担心的细节。请编辑问题并显示表格定义。
    • @JakeWagner -“问题已被完全编辑以描绘旧的 data_type 更改”不,它没有。我没有看到 DDL 显示引用列的实际数据类型。只有您对它们的处理,可能正确也可能不正确并反映实际数据类型。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2018-04-30
    • 2011-05-09
    相关资源
    最近更新 更多