大家好,我是Apache Drill的新手,在将Oracle特定的sql脚本(pl/sql(转换为基于Drill查询时遇到了问题。例如,我有一个Scripts,他检查最近X天内处理的数据。
在这个脚本中,我使用了sysdate函数。
这是我的旧脚本:
SELECT i.id,i.status,status_text,i.kunnr,i.bukrs,i.belnr,i.gjahr,event,i.sndprn,i.createdate,executedate,tstamp,v.typ_text,i.docnum,i.description, i.*
FROM in_job i JOIN vstatus_injob v ON i.id= v.id
WHERE 1=1
AND i.createdate > sysdate - 30.5
order by i.createdate desc;
当我查阅特定于钻取的Datetime-Diff函数时;TIMESTAMPDIFF";。
这是我的";钻探的";脚本:
SELECT i.id, i.status, status_text, i.kunnr, i.bukrs, i.belnr, i.gjahr, i.event, i.sndprn, i.createdate, i.executedate, i.tstamp,v.typ_text,i.docnum,i.description,i.*
FROM SchemaNAME.IN_JOB i JOIN SchemaNAME.VSTATUS_INJOB v ON i.id=v.id
WHERE TIMESTAMPDIFF(DAY, CURRENT_TIMESTAMP, i.createdate) >=30
返回的错误如下所示:
DATA_READ ERROR: The JDBC storage plugin failed while trying setup the SQL query.
通过进一步检查,我可以看到Oracle特定的错误,上面写着:
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "TIMESTAMPDIFF": invalid ID
所以现在我的问题是:我认为apache drill取代了";TIMSTAMPDIFF";在运行时。但从我在日志中看到的情况来看,它更像是Drill Hands over the Function Call;TIMESTAMPDIFF";到Oracle数据库。如果这是真的,我怎么能修改我的脚本来计算时差(以天为单位(,并将其与int(即脚本中的30(进行比较呢。
如果我像上面那样使用sysdate,Apache Drill会跳进来说它不知道";sysdate";。你们会怎么处理?
提前感谢这么长时间的
:(
我找到了一个解决方案。。。
以防万一有人(甚至将来的我(也有类似的问题。
{
"queryType": "SQL",
"query": "select to_char(SELECT CURRENT_TIMESTAMP - INTERVAL XX MONTH FROM (VALUES(1)),'dd.MM.yy')"
}
通过一些to_char和使用CURRENT_TIMESTAMP-Interval函数调用,我可以获得所需的一切。
我接受了上面的查询,将其打包到Grafana变量中,命名为";timeStmpDiff";然后通过对我的Drill实例的json Api调用查询所有内容。
基本上:
"query" : "SELECT i.id, i.status, status_text, i.kunnr, i.bukrs, i.belnr, i.gjahr, i.event, i.sndprn, i.createdate, i.executedate, i.tstamp,v.typ_text,i.docnum,i.description,i.* FROM ${Schema}.IN_JOB i JOIN ${Schema}.VSTATUS_INJOB v ON i.id=v.id WHERE i.createdate >= '${timeStmpDiff}' order by i.createdate desc"
当然,您可以通过一个子select在进行中查询它。但因为我使用grafana,所以把它捆绑在一个变量中对我来说是有意义的。