繁体   English   中英

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

[英]Crystal report failed to retrieve data from database

水晶报表中是否有错误,问题在于他自oracle起就无法恢复数据,我在oracle上进行了查询,但是当我将其发布到命令中时,起初它运行良好,但稍后他向我展示了这一点错误,请有人可以帮助我,这是查询

select to_char(to_date('1970-01-01 00','yyyy-mm-dd hh24') + (time)/60/60/24 
, '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=to_char(to_date('1970-01-01 00','yyyy-mm-dd hh24') + 
  (time)/60/60/24 , 'DD/MM/YY')
    where   O.DELETE_TIME IS NULL

检索数据失败:

在此处输入图片说明

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

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

如果针对简单的其他数据库运行SAP:不同的数据库,不同的数据集。 您只需要跟踪恶意记录。

如果在两种情况下都是相同的数据库,那将更加困难。 也许Crystal Reports设置的会话日期格式与您的Oracle客户端相比不同? 如果您的查询具有隐式日期转换,这会引起麻烦。 隐式日期转换没有明显的候选对象,但是您比我们更了解您的数据模型。

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

您的错误在这里:

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的类型为DATE TO_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-01-01 00:00:00”以来的秒数中,则查询甚至会更加简单。 如前所述,不使用适当的数据类型(在这种情况下为DATE ,即Oracle的datetime数据类型或TIMESTAMP )是个坏主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM