将日期字符串转换为日期时出错

时间:2013-01-29 07:11:43

标签: oracle date-arithmetic ora-01858

在我的项目中,任何事件的my_table时间都以数字格式存储。现在我必须将其转换为oracle datetime格式。

以下是一个解释:

示例1:
•Sched_Arr_Tm = 0450,将等于04:30(前2是HH(24小时制。自04 <12,然后只使用该数字作为小时)),接下来的2是小时相当于1小时( .50 * 60分钟= 30分钟)

•Sched_Arr_Tm = 2100,将等于晚上9:00(从21> 12开始,然后是21-12 = 9)

•Sched_Arr_Tm = 1475,等于02:45 Pm(前2是HH(24小时制。自14> 12.然后取14-12 = 2),然后只使用该数字作为小时))接下来的2小时相当于一小时(.75 * 60分钟= 45分钟)

•Sched_Arr_Tm = 0075,将等于上午12:45(因为小时= 00,然后小时= 12),接下来的2小时相当于一小时(.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:找到了一个非数字字符,其中包含数字。

1 个答案:

答案 0 :(得分: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>