Crystal报表无法从数据库中检索数据

时间:2017-11-23 17:05:56

标签: sql oracle crystal-reports

水晶报告中是否有错误问题是他自从oracle以来无法恢复数据,我做了一个可以在oracle上运行的查询但是当我在命令上发布它时,起初效果很好但过了一会儿他告诉我这个错误,请有人可以帮助我 这是查询

if (getFacesConfigXmlVersion(facesContext).equals("2.3") || getWebXmlVersion(facesContext).equals("4.0")) {
                throw new FacesException("Unable to find CDI BeanManager");
}

无法检索数据:

enter image description here

2 个答案:

答案 0 :(得分:0)

您得到的错误是ora-1843: not a valid month。这是一个数据转换错误,当我们尝试将字符串转换为日期并且该字符串包含的值不是有效日期时,Oracle会抛出该错误。

至于为什么在Oracle中运行查询时没有得到这个,取决于您是否为两个客户端使用相同的数据库。

如果您正在针对另一个简单的数据库运行SAP:不同的数据库,不同的数据集。你只需要追踪流氓记录。

如果两个案例中的数据库相同,那就更难了。也许Crystal Reports与Oracle客户端相比设置了不同的会话日期格式集?如果您的查询具有隐式日期转换,则会产生这种情况。隐式日期转换没有明显的候选人,但您比我们更了解您的数据模型。

答案 1 :(得分:0)

将日期和时间戳存储在适当的数据类型中是一个坏主意,而不是数字。这导致了你所面临的问题。

你的错误在这里:

T.BEGIN_TIME = to_char(to_date('1970-01-01 00','yyyy-mm-dd hh24') +
               (time)/60/60/24 , 'DD/MM/YY')

T.BEGIN_TIME的类型为DATETO_CHAR(...),但是是一个字符串。因此Oracle会转换您的数据以便比较这两者。它会将您的字符串转换为DATE,以便比较两个日期。您的字符串包含格式为' DD / MM / YY'的日期。根据会话设置,Oracle会尝试以某种方式解释它。您收到错误,因为此失败。我想你的会话设置表明日期从月份开始,所以' 13/02/17'被解释为' 2017-13-02',其中包含无效月份。

如果您想使用日期时间,请不要使用字符串。要获取时间戳的日期部分,请改用TRUNC

更正了查询:

select 
  to_char(date '1970-01-01' + interval '1' second * time, 'yyyy-mm-dd') datestr,
  l.loginid,
  l.status,
  l.time,
  o.presentation_name,
  n_callsanswered_
from rep_stat_db.login  l
join gcti_dmart.o_agent_day o on l.agentdbid = o.confserver_obj_id
join gcti_dmart.r_agent_day r on o.object_id = r.object_id
join gcti_dmart.t_agent_day t
       on t.time_key = r.time_key
       and t.begin_time = trunc(date '1970-01-01' + interval '1' second * time)
where o.delete_time is null;

如果您将时间戳存储在DATE而不是自1970-19-01 00:00:00' 1970-01-01 00:00:00'以后,查询甚至更简单。如上所述,这不是一个坏主意,在这种情况下不使用适当的数据类型(DATE,即Oracle的日期时间数据类型,或TIMESTAMP)。