2017-08-29 198 views
0

)この「ORA-01850」エラーは、問合せのLOGIN_TIME部分でのみ実行されています。ORA-01850 TO_NUMのエラー(TO_CHAR(TO_DATEファンクション

基本的に私の質問にはログイン時間を読んでください。もしそれが必要ならばそれはその後、秒に変換することができるように、バックダウンの24時間にその時間を短縮その後、24時間を超える。

私は、エラーを修正すると思う?しかし、どのように私もそれを行うのですか?

SELECT 
CALL_DATE as "Date" 
, TO_NUMBER(TO_CHAR(TO_DATE(CALL_TIME,'hh24:mi:ss'),'sssss'))/86400 as "Time" 
, AGENT_GROUP as "Agent Group" 
, AGENT_NAME as "Agent Name" 
, STATE as "State" 
, REASON_CODE as "Reason Code" 
, TO_NUMBER(TO_CHAR(TO_DATE(LOGIN_TIME,'hh24:mi:ss'),'sssss'))/86400 as "Login Time" 
, TO_NUMBER(TO_CHAR(TO_DATE(READY_TIME,'hh24:mi:ss'),'sssss'))/86400 as "Ready Time" 
, TO_NUMBER(TO_CHAR(TO_DATE(NOT_READY_TIME,'hh24:mi:ss'),'sssss'))/86400 as "Not Ready Time" 

FROM DB.AGENT_DETAILS 

WHERE 
AGENT_GROUP in ('Sales') 
and TRUNC(CALL_DATE) BETWEEN '01-January-2017' and TRUNC(SYSDATE) 
+0

'READY_TIME'と' NOT_READY_TIME'、 'CALL_TIME'、' LOGIN_TIME'のデータ型は何ですか? 「VARCHAR2」の場合、「ORA-01850時間は0から23の間でなければなりません」は、少なくとも1つの行が24以上の数字で始まることを意味します。 DATEの場合、暗黙的な変換の問題が発生しています(つまり、既にDATEの場合は、TO_DATEを呼び出さないでください)。 –

+0

すでにDATEになっている場合は、必要なものを得るための別の方法として '(call_time-trunc(call_time))* 86400'があります。これにより、非常に多くのデータ型変換が不要になります。 –

+0

はい、VARCHAR2です。そして、はい、それは "ORA-01850時間は0と23時間の間でなければなりません"というエラーです。だから、どのように節を追加して、より大きな時を24に変換するのですか?それが私がやろうとしていることです。 – Melanie

答えて

1

問題は、データがVARCHAR2に格納され、非標準の方法を使用して1日を超える間隔を格納していることです。したがって、組み込みのOracle関数で使用できる形式にするには、少しの文字列操作を行う必要があります。

TO_DSINTERVALは、時間、分、および秒で表されるISO間隔をオプションで受け入れることができますが、それはPT24H03M55Sのように見える必要があります。ここで

は一例です。

with q1 as (
    /*here is the source data*/ 
    select '24:03:45' as t from dual 
), q2 as (
    /*parse and convert to iso interval format*/ 
    select 'PT' || substr(t,1,2) || 'H' 
       || substr(t,4,2) || 'M' 
       || substr(t,7,2) || 'S' 
    as iso from q1 
), q3 as (
    /*convert to an Oracle Day-To-Second Interval*/ 
    select to_dsinterval(iso) i from q2 
) 
    /*convert interval to whole number of seconds*/ 
select trunc((i + sysdate - sysdate) * 86400) as sssss from q3; 

86625