0

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

下面是一个解释:

示例 1:
•Sched_Arr_Tm = 0450,将等于凌晨 04:30(前 2 个是 HH(24 小时制。由于 04 < 12,因此只需将该数字用作小时)),接下来的 2 个是小时的小数(0.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是一小时的小数(0.75 * 60 分钟 = 45 分钟)

•Sched_Arr_Tm = 0075,将等于上午 12:45(因为小时 = 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: 在需要数字的地方发现了一个非数字字符。

4

1 回答 1

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>
于 2013-01-29T07:42:42.180 回答