英文:
Grafana: $__timeGroup with dateadd()
问题
将`DATETIME_FIELD`传递给 `$__timeGroup` 之前,我想在其中添加一定数量的秒数:
SELECT $__timeGroup(DATEADD(second, 10, DATETIME_FIELD), $aggr_interval)
FROM MY_TABLE
然而,这会导致失败:“插值失败:解析间隔时发生错误 10”,尽管如果它能够生成,SQL 查询将被 SQL 服务器接受。应该生成以下内容:
SELECT FLOOR(DATEDIFF(second, '1970-01-01', DATEADD(second, 10, DATETIME_FIELD))/604800)*604800
FROM MY_TABLE
如何将`DATEADD`函数作为参数传递给`$__timeGroup`?
英文:
Given a Grafana panel with the following (part of an) sql query on an SQL-server database:
SELECT $__timeGroup(DATETIME_FIELD, $aggr_interval) -- $aggr_interval = '7d'
FROM MY_TABLE
which is translated into the following SQL query (according to the "Query inspector"):
SELECT FLOOR(DATEDIFF(second, '1970-01-01', DATETIME_FIELD)/604800)*604800
FROM MY_TABLE
Now, I'd like to add a number of seconds to the DATETIME_FIELD
before passing it to $__timeGroup
:
SELECT $__timeGroup(DATEADD(second, 10, DATETIME_FIELD), $aggr_interval)
FROM MY_TABLE
However, this results in a failure: interpolation failed: error parsing interval 10
even though the sql query would be acceptable to the sql server - if it would be generated. This is what should be generated:
SELECT FLOOR(DATEDIFF(second, '1970-01-01', DATEADD(second, 10, DATETIME_FIELD))/604800)*604800
FROM MY_TABLE
How to pass the DATEADD
function as a parameter to $__timeGroup
?
答案1
得分: 2
Grafana在$__timeGroup
内部解析内容时出现问题:表达式内的逗号会导致解析错误。因此,它会将10
视为$__timeGroup
的第二个参数。最可能逗号和括号也不被允许。
据我所知,无法在$__timeGroup
内部转义传递的表达式。您需要避免逗号和括号。
最简单的方法是使用类似于DATETIME_FIELD + 1./24/60/6
的表达式,而不是使用DATEADD
,如果可能的话。
如果将DATETIME_FIELD
视为数字不可行,您需要使用子查询来准备数据。对于您的示例,可以按照以下方式进行操作:
SELECT $__timeGroup(mdate, $aggr_interval)
FROM (SELECT DATEADD(second, 10, DATETIME_FIELD) mdate
FROM MY_TABLE)
编辑:
对于OP的确切情况,更新的查询如下:
SELECT $__timeGroup(mdate, $aggr_interval) as time,
count(*) as value,
'Metric name' as metric
FROM (SELECT id,
DATEADD(second, 10, DATETIME_FIELD) as mdate from MY_TABLE
WHERE $__timeFilter(DATETIME_FIELD)
)
GROUP BY $__timeGroup(mdate, $aggr_interval)
ORDER BY 1
英文:
Grafana has trouble parsing content inside $__timeGroup
: a comma inside your expression throws it off. As a result, it thinks that 10
is the second parameter of $__timeGroup
. Most likely parentheses are not welcome too.
AFAIK, there is no way to escape the expression passed inside $__timeGroup
. You'll need to avoid commas and parentheses.
The simplest way is to use an expression like DATETIME_FIELD + 1./24/60/6
instead DATEADD
, if possible.
if treating DATETIME_FIELD
as a number is not possible - you'll need to use a sub-query to prepare your data. For your example something along the lines of:
SELECT $__timeGroup(mdate, $aggr_interval)
FROM (SELECT DATEADD(second, 10, DATETIME_FIELD) mdate
FROM MY_TABLE)
EDIT:
Updated query for exact case of OP:
SELECT $__timeGroup(mdate, $aggr_interval) as time,
count(*) as value,
'Metric name' as metric
FROM (SELECT id,
DATEADD(second, 10, DATETIME_FIELD) as mdate from MY_TABLE
WHERE $__timeFilter(DATETIME_FIELD)
)
GROUP BY $__timeGroup(mdate, $aggr_interval)
ORDER BY 1
答案2
得分: 2
基于markalex的答案,可以使用FROM子句中的子选择语句来解决,该子选择语句准备数据:
SELECT $__timeGroup(a.mdate, $aggr_interval)
FROM MY_TABLE
inner join (select id, DATEADD(second, 10, DATETIME_FIELD) as mdate from MY_TABLE) as a on a.id = MY_TABLE.id
子选择语句与主查询相关联,使用id列,以便为每个主查询记录提供相同的记录,从而实现为DATETIME_FIELD
准备修改后值的目标。
更大的背景:完整的Grafana面板查询
虽然不是问题的一部分,$__timeGroup
经常被用作Grafana时间序列查询中的x轴值。以下是在查询中如何使用它,该查询提供x轴值、y轴值和指标名称:
SELECT $__timeGroup(mdate, $aggr_interval) as time, count(*), 'Metric name' as metric
FROM MY_TABLE
inner join (select id, DATEADD(second, 10, DATETIME_FIELD) as mdate from MY_TABLE) as a on a.id = MY_TABLE.id
WHERE $__timeFilter(DATETIME_FIELD)
GROUP BY $__timeGroup(mdate, $aggr_interval) order by 1
英文:
Based on markalex's answer there is a solution using a subselect in the from clause, which prepares the data:
SELECT $__timeGroup(a.mdate, $aggr_interval)
FROM MY_TABLE
inner join (select id, DATEADD(second, 10, DATETIME_FIELD) as mdate from MY_TABLE) as a on a.id = MY_TABLE.id
The subselect is correlated with the main query with the id column so that the subselect provides one and the same record for every main query record, in order to achieve the goal of preparing a modified value for DATETIME_FIELD
.
Bigger picture: Full Grafana panel query
Although not part of the posted question, $__timeGroup
is often used as x-axis value in a Grafana time-series query. Here is how it's being used in a query that provides x-axis value, y-axis value and metric name:
SELECT $__timeGroup(mdate, $aggr_interval) as time, count(*), 'Metric name' as metric
FROM MY_TABLE
inner join (select id, DATEADD(second, 10, DATETIME_FIELD) as mdate from MY_TABLE) as a on a.id = MY_TABLE.id
WHERE $__timeFilter(DATETIME_FIELD)
GROUP BY $__timeGroup(mdate, $aggr_interval) order by 1
答案3
得分: 0
我遇到了相同的错误,我创建了一个新列来执行 time_add
。
选择
$__timeGroup(日期, '3m', 0) 作为时间,
计数(行),
date_add(日期, interval 1 天) 作为时间2
从 表格
为了显示时间序列图,您必须添加一个转换来组织字段并隐藏时间列。
英文:
I had the same error, I created a new column to do the time_add
.
Select
$__timeGroup(Date, '3m', 0) as time,
count(rows),
date_add(Date, interval 1 day) as time2
From table
To display the time series graph you have to add a transformation Organize fields and hide the time column.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论