Ошибка при преобразовании даты на дату

В моем проекте в my_table время любого события хранится в числовом формате. Теперь я должен преобразовать его в формат даты и времени оракула.

Вот объяснение ниже:

Example1 :
•Sched_Arr_Tm = 0450, will equal 04:30 am (the first 2 is HH (24 hour clock. Since 04 < 12, then just use that number as the hour)) and the next 2 are the fractional equivalent of an hour (.50 * 60 min = 30 min)

•Sched_Arr_Tm = 2100, will equal 9:00 PM (since 21> 12, then take 21-12=9)

•Sched_Arr_Tm = 1475, will equal 02:45 Pm (the first 2 is HH (24 hour clock. Since 14 > 12. Then take 14-12=2), then just use that number as the hour)) and the next 2 are the fractional equivalent of an hour (.75 * 60 min = 45 min)

• Sched_Arr_Tm = 0075, будет равен 12:45 AM (с часа = 00, затем час = 12), а следующие 2 - дробный эквивалент часа (0,75 * 60 мин = 45 мин)

Я могу извлечь данные в соответствии с вышеприведенным логином, но получаю ошибку при преобразовании ее на сегодняшний день.

select sched_arr_tm,
    LPAD(substr(tn.sched_arr_tm, 1,length(tn.sched_arr_tm) - 2),2,'0') as HH,
    RPAD(TRUNC(TO_NUMBER(substr(tn.sched_arr_tm,3,length(tn.sched_arr_tm) - 2)) * .60,0),2,'0') as MM,
    '00' AS SS,
    LPAD(substr(tn.sched_arr_tm,1,length(tn.sched_arr_tm) - 2),2,'0')
    ||':' ||
    RPAD(TRUNC(TO_NUMBER(substr(tn.sched_arr_tm,3,length(tn.sched_arr_tm) - 2)) * .60,0),2,'0') 
    ||':'||
    LPAD(0,2,0) AS DTTM,
    TO_DATE(LPAD(substr(tn.sched_arr_tm,1,length(tn.sched_arr_tm) - 2),2,'0')
          ||':' ||
           RPAD(TRUNC(TO_NUMBER(substr(tn.sched_arr_tm,3,length(tn.sched_arr_tm) - 2)) * .60,0),2,'0') 
          ||':'|| 
           LPAD(00,2,0),'HH24:MI:SS') AS DTTM,
   tn.sched_slip_arr_tm

из MY_TABLE;

Я получаю эту ошибку:

ORA-01858: был найден нечисловой символ, где ожидалось число.

0
nl ja de

1 ответы

вы можете сделать это с помощью:

SQL> with data as (select 450 Sched_Arr_Tm from dual
  2                union all
  3                select 1475 from dual
  4                union all
  5                select 2100 from dual)
  6  select Sched_Arr_Tm, to_date(hours||':'||(60*(mins/100)), 'hh24:mi')
  7    from (select Sched_Arr_Tm, substr(Sched_Arr_Tm, -2) mins,
  8                substr(Sched_Arr_Tm, 1, length(Sched_Arr_Tm)-2) hours
  9            from data)
 10  /

SCHED_ARR_TM TO_DATE(HOURS||':
------------ -----------------
         450 01-jan-2013 04:30
        1475 01-jan-2013 14:45
        2100 01-jan-2013 21:00

SQL>
1
добавлено
СПАСИБО ЗА ВАШ ОТВЕТ
добавлено автор Bit_hunter, источник
Oracle RU
Oracle RU
303 участник(ов)

Русскоязычная группа по Oracle. — Архитектура СУБД — PL/SQL — Оптимизация — Администрирование — Вакансии Oracle (указать инфу по вилке ЗП и удалёнке) Приглашайте коллег :-) Запрещены: личные оскорбления, обсуждения оффтопик вопросов политики и религии