Plsql ORA-01850 TO_NUM(TO_CHAR)(TO_DATE函数)错误
我只在查询的登录时间部分遇到了“ORA-01850”错误。我相信这是因为我团队中的一些人在轮班结束时忘记了注销,因此他们在某些数据字段上的登录时间超过了24小时(这是不应该的) 所以基本上我想让我的查询做的是:读取登录时间,如果超过24小时,则将该时间减少到24小时,这样就可以将其转换为秒 我想这会纠正错误,但我该怎么做呢Plsql ORA-01850 TO_NUM(TO_CHAR)(TO_DATE函数)错误,plsql,Plsql,我只在查询的登录时间部分遇到了“ORA-01850”错误。我相信这是因为我团队中的一些人在轮班结束时忘记了注销,因此他们在某些数据字段上的登录时间超过了24小时(这是不应该的) 所以基本上我想让我的查询做的是:读取登录时间,如果超过24小时,则将该时间减少到24小时,这样就可以将其转换为秒 我想这会纠正错误,但我该怎么做呢 SELECT CALL_DATE as "Date" , TO_NUMBER(TO_CHAR(TO_DATE(CALL_TIME,'hh24:mi:ss'),'sssss')
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)
问题是您的数据存储在VARCHAR2s中,并且它们使用非标准方法来存储大于一天的时间间隔。因此,我们需要进行一点字符串操作,以将它们转换为内置Oracle函数可以使用的格式 Oracle的一个功能是使用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
CALL\u TIME
、LOGIN\u TIME
、READY\u TIME
和NOT\u READY\u TIME
的数据类型是什么?如果它们是VARCHAR2s,ORA-01850小时必须介于0和23之间,这意味着至少有一行以数字24或更大开始;如果它们是日期,则意味着存在隐式转换问题(也就是说,如果它们已经是日期,你就不应该在它们上面调用日期)。如果它们已经是日期,另一种获取所需信息的方法是(call_time-trunc(call_time))*86400
,这样就不需要太多的数据类型转换。是的,它们是VARCHAR2。是的,这是“ORA-01850小时必须在0到23小时之间”错误。那么我如何添加一个子句来将较大的时间转换回24?这就是我试图做的。(call_time-trunc(call_time))*86400…对我不起作用。但它不会,因为它是VARCHAR2正确的?