Oracle数据库上的Apache Drill Timestampdiff



大家好,我是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,所以把它捆绑在一个变量中对我来说是有意义的。

最新更新