Преобразование даты столбца Excel с использованием различных шаблонов - Oracle PLSQL - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь преобразовать столбец DATA_EMISSAO , который имеет формат char , но содержит все даты для таблицы (она содержит только даты).

Проблема в том, что способ загрузки информации в Oracle позволил установить ряды с различными шаблонами, как показано ниже:

enter image description here

Как вы можете видеть, существует 2 шаблона: «ДД / ММ / ГГГГ» и формат даты в формате Excel.

1) Сначала я попытался преобразовать их с помощью кода:

  select distinct to_char(DATA_EMISSAO, 'DD-MM-YYYY') from MASTERSAF;

Но получил ошибку:

  ORA-01722: invalid number
  01722. 00000 -  "invalid number"
  *Cause:    The specified number was invalid.
  *Action:   Specify a valid number.

2) Затем я попробовал следующее:

  select distinct to_char(to_date(DATA_EMISSAO, 'DD-MM-YYYY'), 'DD-MM-YYYY') from MASTERSAF;

Но безуспешно ...

   ORA-01847: day of month must be between 1 and last day of month
   01847. 00000 -  "day of month must be between 1 and last day of month"
   *Cause:    
   *Action:  

Как вы думаете, должно быть лучше построить условие длячитать каждое условие строки и применять правильное «преобразование»?

Кроме того, я не знаю почему, но если я запускаю

   select to_char(to_date(DATA_EMISSAO, 'DD/MM/YYYY') + 0, 'DD/MM/YYYY') as DATES2 from MASTERSAF;

Кажется, все идет хорошо, но если я поставлю отчетливо до,

                select distinct to_char(to_date(DATA_EMISSAO, 'DD/MM/YYYY') + 0, 'DD/MM/YYYY') as DATES2 from MASTERSAF;

Я получаю следующую ошибку:

    ORA-01847: day of month must be between 1 and last day of month
    01847. 00000 -  "day of month must be between 1 and last day of month"
    *Cause:    
    *Action:

У вас есть идея исправить даты?(к сожалению, я не могу изменить на Excel, потому что база данных слишком велика ....)

1 Ответ

0 голосов
/ 24 января 2019

Используйте оператор CASE, чтобы сопоставить различные форматы и преобразовать их в дату, используя соответствующий метод (DD/MM/YYYY можно преобразовать с помощью TO_DATE, а одно число можно преобразовать, добавив дни к 1900-01-01 ):

Установка Oracle :

CREATE TABLE dates ( date_emissao ) AS
SELECT '12/08/2016' FROM DUAL UNION ALL
SELECT '42716' FROM DUAL

Запрос

SELECT CASE
       WHEN REGEXP_LIKE( date_emissao, '^\d+$' )
       THEN DATE '1900-01-01' + TO_NUMBER( date_emissao )
       ELSE TO_DATE( date_emissao, 'DD/MM/YYYY' )
       END AS date_emissao
FROM   dates;

выход

| DATE_EMISSAO |
| :----------- |
| 2016-08-12   |
| 2016-12-14   |

дБ <> скрипка здесь

...