在我的项目中,任何事件的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:找到了一个非数字字符,其中包含数字。
答案 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>