2017-08-29 1 views
0

) Ich bin in diesem "ORA-01850" Fehler nur in der LOGIN_TIME Teil meiner Abfrage. Ich glaube, das ist, weil einige Leute in meinem Team vergessen, sich abzumelden das Ende ihrer Schicht und damit ihre Login-Zeit ist mehr als 24 Stunden für einige dieser Datenfelder (was sollte es nicht).ORA-01850 Fehler bei TO_NUM (TO_CHAR (TO_DATE Funktion

Also im Grunde, was ich möchte meine Abfrage zu tun ist, lesen Sie die Login-Zeit und wenn es 24 Stunden überschreitet dann die Zeit reduzieren wieder auf 24 Stunden, so dass es dann in Sekunden umgerechnet werden kann.

denke ich, dass die Fehler korrigieren? Aber wie mache ich das auch tun?

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

Was ist der Datentyp von 'CALL_TIME',' LOGIN_TIME', 'READY_TIME' und' NOT_READY_TIME'? Wenn sie VARCHAR2 sind, bedeutet "ORA-01850 hour zwischen 0 und 23", dass mindestens eine Zeile mit der Zahl 24 oder höher beginnt; Wenn es sich um DATEs handelt, bedeutet dies, dass Sie ein implizites Konvertierungsproblem erhalten (d. h. wenn sie bereits DATEs sind, sollten Sie für sie kein TO_DATE aufrufen). –

+0

Wenn sie bereits DATEs sind, ist eine alternative Möglichkeit, um zu bekommen, was Sie brauchen, '(call_time-trunc (call_time)) * 86400', die die Notwendigkeit für so viele Datentyp-Konvertierungen beseitigt. –

+0

Ja, sie sind VARCHAR2. Und ja, es ist der Fehler "ORA-01850 muss zwischen 0 und 23 Stunden sein". Also, wie füge ich eine Klausel hinzu, um die Zeiten, die größer sind, zurück in 24 zu konvertieren? Das ist es, was ich versuche zu tun. – Melanie

Antwort

1

Das Problem besteht darin, dass Ihre Daten in VARCHAR2s gespeichert sind und sie eine nicht standardmäßige Methode zum Speichern von Intervallen verwenden, die länger als ein Tag sind. Daher müssen wir ein wenig String-Manipulation durchführen, um sie in ein Format zu bringen, das von einer integrierten Oracle-Funktion konsumiert werden kann.

Eine solche Oracle-Funktion, die helfen kann, ist TO_DSINTERVAL, die optional ein ISO-Intervall in Stunden, Minuten und Sekunden annehmen kann - aber es muss wie PT24H03M55S aussehen. Hier

ein Beispiel:

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 
Verwandte Themen