在Oracle中将24小时时间转换为12小时时间

时间:2016-09-27 13:28:32

标签: oracle

我已经搜索了SO和其他网站很长一段时间,所以如果这是我错过的重复,我会道歉。

鉴于示例字符串Thu 09/22 15:17:46 PM - PHONE,它来自具有varchar2数据类型的表,我需要将15:17:46 PM转换为3:17 PM,以便得到字符串是星期四09/22 3:17 PM - 电话。

我用来检索数据的查询是(更大的查询的一部分):

( SELECT TO_CHAR (TO_DATE ( notetext, 'dd/mm/yyyy hh24:mi:ss'), 'Dy MM/DD') || ' ' || TO_CHAR ( TO_DATE (notetext, 'dd/mm/yyyy hh24:mi:ss'), 'hh24:mi:ss AM') || ' - ' || notetype
              FROM
                a pnx
              WHERE
                pnx.notetype IN ('FAX', 'PHONE')
              AND pnx.episode = ep.episodenbr
            ) END)      AS RFIINDICATOR

其中notetext是具有数据的部分Thu 09/22 15:17:46 PM并且notetype具有数据PHONE。两者都是varchar2数据类型。

我试图调用提取函数来拉出时间部分,做一个

to_char (RFIINDICATOR, 'HH12:MI:SS PM')

所有产生无效数字错误或其他一些Oracle错误。

有什么建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

也许这样的事情(只有很多方法可以使这只猫皮肤化):

with
     inputs ( str ) as (
       select 'Thu 09/22 15:17:46 PM - PHONE' from dual union all
       select 'Thu 09/22 9:17:46 AM - PHONE'  from dual
     ),
     fragments ( str, dt, other ) as (
       select str, substr(str, 1, instr(str, ' ', 1, 3) - 1),
              substr(str, instr(str, ' ', 1, 4))
       from inputs
     )
select str, to_char(to_date(dt, 'Dy mm/dd hh24:mi:ss'), 'Dy mm/dd hh:mi:ssAM') || 
                                                                      other as new_str
from   fragments
;

STR                           NEW_STR
----------------------------- ------------------------------
Thu 09/22 15:17:46 PM - PHONE Thu 09/22 03:17:46PM - PHONE
Thu 09/22 9:17:46 AM - PHONE  Thu 09/22 09:17:46AM - PHONE