PL-SQL链接Excel文件的时间总结问题

时间:2017-06-21 19:06:45

标签: excel oracle time plsql toad

我会尽力彻底解释这个问题,因为我花了几天时间试图找出解决这个问题的方法无济于事。

我有一些我建立的excel报告模板参考Five9 Call Data导出。我一直在手动定期从Five9应用程序中导出数据来刷新这些报告,所以我决定通过对导出进行编码并让它们直接链接到我的excel工作簿报告,使我的流程更加高效和自动化清爽。

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

我的报告依赖于能够从我的导出中汇总时间数据,但我的SUM公式现在在不应该的时候导致零。问题不在于将列格式化为时间([h]:mm:ss ...是的,这也是我的第一个想法)。问题是数据实际上根本没有被识别为时间并被识别为文本。 本文解释了我遇到的确切问题:http://theexceltrainer.co.uk/adding-up-times-in-excel-results-in-zero/

问题是它没有给我一个合理的解决方法。如果我执行文本到列的技巧,他们建议在我下次需要刷新报表时刷新数据时不会坚持(时间将恢复为标识为文本)。编码我的出口的整个目的是使这个过程完全自动化,因此每次完全失去目的时必须进入并重新格式化(做文本到列的事情)。

这没有其他解决方法吗?可能要添加到代码中的东西会使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

RING_TIME,DIAL_TIME,CALL_TIME_2和AFTER_CALL_WORK_TIME是我需要能够SUM的字段。他们已经采用了正确格式的“hh:mm:ss”......但是Excel仍然没有将它们视为时间......

1 个答案:

答案 0 :(得分:0)

我可以建议第一手替换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

这基本上细分了每个字段的时间元素(小时,分钟),在几秒钟内得到它们的表示,为所有想要的列添加,最后将结果秒转换为第二个'日期&# 39;与numtodsinterval的间隔。

请注意,我从您的OP中假设字段

  

已经提取了正确的格式" hh:mm:ss"

所以substr函数以预期的位置顺序拉出小时,分钟,秒的元素。

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