Вычитая даты ORA 01722 - PullRequest
       1

Вычитая даты ORA 01722

0 голосов
/ 26 февраля 2020

Я пытаюсь вычесть две даты и получить взамен integer значение. Кажется, я столкнулся с препятствием, поскольку одна из двух дат пуста, что впоследствии возвращает ошибку. Есть ли обходной путь к этому, я желаю вместо этого получить age_date, если значение review_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

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Вы должны преобразовать столбец 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

Вычитание DATE и VARCHAR2 приводит к 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)
   )
1 голос
/ 26 февраля 2020

Цель состоит в том, чтобы выбрать дату старения, дату проверки и difference = (aging_date - review_date). В запросе выбираются aging_date и дата проверки, а для разницы дат. Оператор case вычисляет разницу только тогда, когда aging_date и review_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;
0 голосов
/ 26 февраля 2020

Попробуй это. должен возвращать нулевое значение, если дата обзора отсутствует (просто вычитая дату старения из себя)

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

документация по функции NVL .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...