Как настроить даты в формате "дд / мм / гггг" - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь изменить дату с «дд / мм / гггг» на «дд-мм-гг», но безуспешно.В моем наборе данных у меня есть разные форматы дат, поэтому я хочу отфильтровать их, чтобы правильно исправить

Пример:

  DATES
  -------
  09-MAY-18
  09-NOV-18
  09-OCT-18
  1/2/2017
  1/3/2017
  05/03/2018
  12-OCT-18

так, даты «1/2/2017»,«1/3/2017», «05/03/2018» должны иметь формат «DD-MM-YYYY» как «09 -MAY-18» или «09 -NOV-18 ».

формула, которую я пытался запустить:

   UPDATE TESTE_DATAS SET DATAS = TO_DATE(REGEXP_REPLACE(DATAS, '^\d+\/\d+\/\d+$', 
                                    CONCAT(
                                      CONCAT(
                                        CONCAT(
                                          CONCAT(
                                                REGEXP_SUBSTR(DATAS, '^(\d+)(\/)(\d+)(\/)(\d+)$', 1, 1, 'i', 1),
                                                '-'),
                                                      REGEXP_SUBSTR(DATAS, '^(\d+)(\/)(\d+)(\/)(\d+)$', 1, 1, 'i', 3)),
                                                      '-'),
                                                         REGEXP_SUBSTR(DATAS, '^(\d+)(\/)(\d+)(\/)(\d+)$', 1, 1, 'i', 5)) 
                                        ),'DD-MM-YY') WHERE REGEXP_LIKE(DATAS,'^\d+\/\d+\/\d+$');

В итоге я получил следующее:

Error report -
SQL Error: ORA-01843: not a valid month
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

и ожидаемый результат должен быть:

  DATES
  -------
  09-MAY-18
  09-NOV-18
  09-OCT-18
  01-FEB-17
  01-MAR-17
  05-MAR-18
  12-OCT-18

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Из примеров данных, кажется, существует три разных формата для столбца символьного типа dates.

Рассмотрим кодовый блок ниже.Если возникает исключение форматирования для преобразования в 'dd-MON-yy', формат обновления для других моделей отличается по длине

create table teste_datas( id int, dates varchar2(20),derived_date date);
insert all 
       into teste_datas(id,dates) values(1,'09-MAY-18')
       into teste_datas(id,dates) values(2,'1/2/2017')
       into teste_datas(id,dates) values(3,'05/03/2018')
select * from dual;

begin
    for d in ( select id, trim(dates) as dates from teste_datas order by id )
    loop
     begin  
      update teste_datas 
         set derived_date = to_date(d.dates,'dd-MON-yy')
       where id = d.id;
      exception when others then
       begin 
        if length(d.dates)<10 then 
          update teste_datas 
             set derived_date = to_date(d.dates,'mm/dd/yyyy')
           where id = d.id;       
        else   
          update teste_datas 
             set derived_date = to_date(d.dates,'dd/mm/yyyy')
           where id = d.id;       
        end if;   
       end;  
     end;    
    end loop;  
  end;  

  select * from teste_datas;

  ID    DATES       DERIVED_DATE
  ---   ----------  ------------
  1     09-MAY-18   09.05.2018
  2     1/2/2017    02.01.2017
  3     05/03/2018  05.03.2018

  select to_char(derived_date,'dd-MON-yy') as derived_date from teste_datas;

  DERIVED_DATE
  ------------
  09-MAY-18
  02-JAN-17
  05-MAR-18
0 голосов
/ 08 февраля 2019

Вы можете сначала преобразовать строку в дату с помощью TO_DATE, а затем отформатировать дату с помощью TO_CHAR:

update teste_datas set datas = to_char(to_date(datas, 'DD/MM/YYYY'), 'DD-MON-YY') where datas like '%/%/%';
...