Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Plsql ORA-01850 TO_NUM(TO_CHAR)(TO_DATE函数)错误_Plsql - Fatal编程技术网

Plsql ORA-01850 TO_NUM(TO_CHAR)(TO_DATE函数)错误

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')

我只在查询的登录时间部分遇到了“ORA-01850”错误。我相信这是因为我团队中的一些人在轮班结束时忘记了注销,因此他们在某些数据字段上的登录时间超过了24小时(这是不应该的)

所以基本上我想让我的查询做的是:读取登录时间,如果超过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)

问题是您的数据存储在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正确的?