Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
PL-SQL链接Excel文件的时间求和问题_Excel_Oracle_Time_Plsql_Toad - Fatal编程技术网

PL-SQL链接Excel文件的时间求和问题

PL-SQL链接Excel文件的时间求和问题,excel,oracle,time,plsql,toad,Excel,Oracle,Time,Plsql,Toad,我将尽我最大的努力彻底解释这个问题,因为我已经花了很多天的时间试图找出一个解决这个问题的方法,但毫无效果 我有一些excel报告模板,我已经建立了参考Five9调用数据导出。我不得不定期手动从Five9应用程序中导出数据以刷新这些报告,因此我决定通过对导出进行编码并将它们直接链接到excel工作簿报告以方便刷新,从而使我的过程更加高效和自动化 我有基本的T-SQL经验,但意识到我需要PL-SQL经验,因为这是一个基于Oracle的数据库。几天后,我想出了如何用PL-SQL编写所需的导出代码,并将

我将尽我最大的努力彻底解释这个问题,因为我已经花了很多天的时间试图找出一个解决这个问题的方法,但毫无效果

我有一些excel报告模板,我已经建立了参考Five9调用数据导出。我不得不定期手动从Five9应用程序中导出数据以刷新这些报告,因此我决定通过对导出进行编码并将它们直接链接到excel工作簿报告以方便刷新,从而使我的过程更加高效和自动化

我有基本的T-SQL经验,但意识到我需要PL-SQL经验,因为这是一个基于Oracle的数据库。几天后,我想出了如何用PL-SQL编写所需的导出代码,并将它们设置到链接的excel工作簿中。但后来我遇到了这个问题

我的报告依赖于能够对导出的时间数据求和,但我的求和公式现在的结果是零,而它们本不应该是零。问题不在于将列格式化为时间([h]:mm:ss…是的,这也是我的第一个想法)。问题在于,数据实际上根本不被识别为时间,而是被识别为文本。 这篇文章解释了我正经历的问题:

问题是它没有给我一个合理的解决办法。如果我做了文本到列的技巧,他们建议在下次需要刷新报告时,当我去刷新数据时,这些技巧将不起作用(时间将恢复为标识为文本)。我编写导出代码的全部目的是使这个过程完全自动化,因此每次都必须进入并重新格式化(执行文本到列的操作)完全无法达到目的

没有其他解决办法吗?可能需要在代码中添加一些东西,使excel将时间识别为实际时间而不是文本?当我习惯于手动将数据导出为CSV文件时,问题并不存在……但我无法(或至少我不知道如何)设置同样是CSV的PL-SQL链接excel文件。我不知所措

我已经包括了我的代码,如果这有帮助的话:

SELECT 
CALL_DATE as "Date"
, CALL_TIME as "Time"
, CALL_TIMESTAMP as "Timestamp"
, RING_TIME as "Ring Time"
, DIAL_TIME as "Dial Time"
, CALL_TIME_2 as "Call Time"
, AFTER_CALL_WORK_TIME as "After Call Work Time"
, CAMPAIGN as "Campaign"
, CAMPAIGN_TYPE as "Campaign Type"
, CALL_TYPE as "Call Type"
, DISPOSITION as "Disposition"
, AGENT_GROUP as "Agent Group"
, AGENT_NAME as "Agent Name"
, SALESFORCE_ID as "Salesforce ID"

FROM Comp_DB.FIVE9_CALLS

WHERE 
AGENT_GROUP = 'Collections'
and TRUNC(CALL_DATE) BETWEEN '01-June-2017' and TRUNC(SYSDATE)

ORDER BY
CALL_DATE asc

响铃时间、拨号时间、通话时间2和通话后工作时间是我需要求和的字段。他们已经输入了正确格式的“hh:mm:ss”…但Excel仍然没有将其识别为时间…

第一手资料我可以建议您将WHERE子句中的字符串替换为类似的内容吗?:

TRUNC(CALL_DATE) BETWEEN to_date('01-06-2017','dd-mm-yyyy') and TRUNC(SYSDATE)
这样您就不会让Oracle引擎(希望)解析您的日期值

现在,对于您的问题,您可以在查询中进行“计算”,而不是在Excel中进行,如:

SELECT 
CALL_DATE as "Date"
, CALL_TIME as "Time"
, CALL_TIMESTAMP as "Timestamp"
, RING_TIME as "Ring Time"
, DIAL_TIME as "Dial Time"
, CALL_TIME_2 as "Call Time"
, AFTER_CALL_WORK_TIME as "After Call Work Time"
, CAMPAIGN as "Campaign"
, CAMPAIGN_TYPE as "Campaign Type"
, CALL_TYPE as "Call Type"
, DISPOSITION as "Disposition"
, AGENT_GROUP as "Agent Group"
, AGENT_NAME as "Agent Name"
, SALESFORCE_ID as "Salesforce ID"
, numtodsinterval(
         (SUBSTR(RING_TIME, 1, 2)*3600 + SUBSTR(RING_TIME, 4, 2)*60 + SUBSTR(RING_TIME, 7, 2))+
         (SUBSTR(DIAL_TIME, 1, 2)*3600 + SUBSTR(DIAL_TIME, 4, 2)*60 + SUBSTR(DIAL_TIME, 7, 2))+
         (SUBSTR(CALL_TIME_2, 1, 2)*3600 + SUBSTR(CALL_TIME_2, 4, 2)*60 + SUBSTR(CALL_TIME_2, 7, 2))+
         (SUBSTR(AFTER_CALL_WORK_TIME, 1, 2)*3600 + SUBSTR(AFTER_CALL_WORK_TIME, 4, 2)*60 + SUBSTR(AFTER_CALL_WORK_TIME, 7, 2))
         , 'SECOND') as "Total duration"
FROM Comp_DB.FIVE9_CALLS

WHERE 
AGENT_GROUP = 'Collections'
and TRUNC(CALL_DATE) BETWEEN to_date('01-06-2017','dd-mm-yyyy') and TRUNC(SYSDATE)

ORDER BY
CALL_DATE asc
它基本上从每个字段中细分时间元素(小时、分钟),以秒为单位表示,对所有所需的列进行加法,最后使用
numtodsinterval
将结果秒转换为“从日期到秒”的间隔

注意,我从你的OP中假设

已输入正确格式的“hh:mm:ss”

因此,
substr
函数将按预期的位置顺序拉出元素,时间为小时、分钟、秒


PS:我刚才描述的方法可以帮助您进行行级求和,而不是列级求和,请指定您实际需要的方法,这样我们可以提供更好的答案。

第一手,我可以建议您将WHERE子句中的字符串替换为类似的字符串吗?:

TRUNC(CALL_DATE) BETWEEN to_date('01-06-2017','dd-mm-yyyy') and TRUNC(SYSDATE)
这样您就不会让Oracle引擎(希望)解析您的日期值

现在,对于您的问题,您可以在查询中进行“计算”,而不是在Excel中进行,如:

SELECT 
CALL_DATE as "Date"
, CALL_TIME as "Time"
, CALL_TIMESTAMP as "Timestamp"
, RING_TIME as "Ring Time"
, DIAL_TIME as "Dial Time"
, CALL_TIME_2 as "Call Time"
, AFTER_CALL_WORK_TIME as "After Call Work Time"
, CAMPAIGN as "Campaign"
, CAMPAIGN_TYPE as "Campaign Type"
, CALL_TYPE as "Call Type"
, DISPOSITION as "Disposition"
, AGENT_GROUP as "Agent Group"
, AGENT_NAME as "Agent Name"
, SALESFORCE_ID as "Salesforce ID"
, numtodsinterval(
         (SUBSTR(RING_TIME, 1, 2)*3600 + SUBSTR(RING_TIME, 4, 2)*60 + SUBSTR(RING_TIME, 7, 2))+
         (SUBSTR(DIAL_TIME, 1, 2)*3600 + SUBSTR(DIAL_TIME, 4, 2)*60 + SUBSTR(DIAL_TIME, 7, 2))+
         (SUBSTR(CALL_TIME_2, 1, 2)*3600 + SUBSTR(CALL_TIME_2, 4, 2)*60 + SUBSTR(CALL_TIME_2, 7, 2))+
         (SUBSTR(AFTER_CALL_WORK_TIME, 1, 2)*3600 + SUBSTR(AFTER_CALL_WORK_TIME, 4, 2)*60 + SUBSTR(AFTER_CALL_WORK_TIME, 7, 2))
         , 'SECOND') as "Total duration"
FROM Comp_DB.FIVE9_CALLS

WHERE 
AGENT_GROUP = 'Collections'
and TRUNC(CALL_DATE) BETWEEN to_date('01-06-2017','dd-mm-yyyy') and TRUNC(SYSDATE)

ORDER BY
CALL_DATE asc
它基本上从每个字段中细分时间元素(小时、分钟),以秒为单位表示,对所有所需的列进行加法,最后使用
numtodsinterval
将结果秒转换为“从日期到秒”的间隔

注意,我从你的OP中假设

已输入正确格式的“hh:mm:ss”

因此,
substr
函数将按预期的位置顺序拉出元素,时间为小时、分钟、秒


PS:我刚才描述的方法帮助您进行行级求和,而不是列级求和,请指定您实际需要的方法,以便我们提供更好的答案。

您可以尝试格式化输出上的日期,以便excel识别fomat?从mytable中选择to_char(日期列,'dd/mm/yyyyy hh24:mi:ss');您可以尝试格式化输出上的日期,以便excel识别fomat?从mytable中选择to_char(日期列,'dd/mm/yyyyy hh24:mi:ss');