Oracle 数据库上的 Apache Drill Timestampdiff
Apache Drill Timestampdiff on Oracle DB
大家好,我是 Apache Drill 的新手,我在将我的 Oracle 特定 sql 脚本 (pl/sql) 转换为基于 Drill 的查询时遇到了麻烦。
例如,我有一个脚本,用于检查最近 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;
当我查找特定于钻取的日期时间差异函数时,我发现了“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 将函数调用“TIMESTAMPDIFF”移交给 Oracle 数据库。
如果那是真的,我怎么能改变我的脚本来计算时差(以天为单位)并将它与一个整数(即脚本中的 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 - 间隔函数调用,我可以获得我需要的一切。
我将上面的查询打包到一个 Grafana 变量中,将其命名为“timeStmpDiff”,然后使用 json Api 调用我的 Drill 实例来查询所有内容。
基本上:
"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"
您当然可以使用子选择查询它。
但是因为我使用 grafana,所以将它捆绑在一个变量中对我来说很有意义。
大家好,我是 Apache Drill 的新手,我在将我的 Oracle 特定 sql 脚本 (pl/sql) 转换为基于 Drill 的查询时遇到了麻烦。 例如,我有一个脚本,用于检查最近 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;
当我查找特定于钻取的日期时间差异函数时,我发现了“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 将函数调用“TIMESTAMPDIFF”移交给 Oracle 数据库。 如果那是真的,我怎么能改变我的脚本来计算时差(以天为单位)并将它与一个整数(即脚本中的 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 - 间隔函数调用,我可以获得我需要的一切。
我将上面的查询打包到一个 Grafana 变量中,将其命名为“timeStmpDiff”,然后使用 json Api 调用我的 Drill 实例来查询所有内容。
基本上:
"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"
您当然可以使用子选择查询它。 但是因为我使用 grafana,所以将它捆绑在一个变量中对我来说很有意义。