2017-08-29 114 views
0

我運行到這個「ORA-01850」錯誤的只有我查詢的LOGIN_TIME一部分。我相信這是因爲有些人在我的球隊被遺忘在註銷他們的輪班結束,因此他們的登錄時間超過了24小時,在這些數據字段(它不應該)上的一些數據字段。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

什麼是'CALL_TIME','LOGIN_TIME','READY_TIME'和'NOT_READY_TIME'的數據類型?如果它們是VARCHAR2,'ORA-01850小時必須介於0到23之間'意味着至少有一行以24或更大的數字開始;如果它們是DATE,則意味着您會遇到隱式轉換問題(即,如果它們已經是DATE,則不應在其上調用TO_DATE)。 –

+0

如果他們已經是DATE了,另一種獲得你所需要的方法就是'(call_time-trunc(call_time))* 86400',它不需要這麼多的數據類型轉換。 –

+0

是的,他們是VARCHAR2。是的,這是「ORA-01850小時必須在0到23小時之間」的錯誤。那麼,如何添加一個子句來將時間更長的時間轉換回24?這就是我想要做的。 – Melanie

回答

1

的問題是,您的數據存儲在的varchar2,他們使用的是非標準的方法來存儲間隔超過一天以上。因此,我們需要做一些字符串操作來使它們成爲可以被內置的Oracle函數使用的格式。

一個可以幫助的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