Конвертировать Varchar2 в Date - с помощью оператора Case / Decode / IIF и установить нулевое значение в 1 условие - PullRequest
0 голосов
/ 05 октября 2018

У меня есть столбец с типом данных varchar2 (4000).Тем не менее, этот столбец имеет следующий тип значений '//' '112/01/01', этот столбец является столбцом даты

Я хотел бы получить следующий вывод - IF '//', затем установить его NULL IF'112/01/01', затем установите его как 2012/01/01

У меня возникла проблема, когда я использую оператор case / decode / iif и установил значение как NULL.

Iпопробовал следующий оператор SQL, и он дает мне либо ошибку ORA-00932, либо ошибку Ora-01841.

Вот мои утверждения:

SELECT 
CASE WHEN DATE_CATALOG_SENT = '//' THEN to_date('1950/01/01'), 'yyyy/mm/dd')
     ELSE TO_DATE(substr(DATE_CATALOG_SENT, 2, LENGTH(DATE_CATALOG_SENT)),'yyyy/mm/dd')
END AS abcd
FROM 
DUAL;

SELECT  CASE WHEN DATE_CATALOG_SENT = 0 THEN 'NULL'
             ELSE TO_DATE(substr(DATE_CATALOG_SENT, 2,  LENGTH(DATE_CATALOG_SENT)),'yy/mm/dd') 
END 
FROM DUAL;

Есть ли способ исправить эту проблему с помощью SQLтолько запрос, а не PL / SQL?

Спасибо AD

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете попробовать что-то вроде этого:

with inputs (dt_str) as (
  select '//'        from dual union all
  select '112/01/01' from dual
)
select dt_str,
       to_date(to_char(19000000 + to_number(replace(dt_str, '/')), 'fm00000000')
       , 'yyyymmdd') as resulting_dt
from   inputs
;

DT_STR    RESULTING_DT           
--------- -----------------------
//                               
112/01/01 2012-01-01  

То есть: сначала удалите косые черты;строка становится пустой (NULL) или семизначной строкой.Преобразуйте полученную строку в число, затем добавьте к нему 19000000;сумма по-прежнему равна NULL, если исходная строка была просто '//', а в противном случае - после преобразования обратно в строку - она ​​становится правильным представлением даты в виде строки в формате yyyymmdd.Используйте to_date(...), чтобы окончательно преобразовать его в дату.Если ввод был '//', итоговая дата будет NULL.

Если вместо нуля вы хотите установить дату по умолчанию 1950-01-01, когда ввод '//', вы можете перенестиполное to_date(...) выражение в NVL(......., date '1950-01-01')

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