如何为 Esper 查询添加时区?

How can I add timezone to Esper queries?

我正在使用 Esper,我需要按时间戳过滤事件。这些事件来自外部来源。

挑战在于截止时刻与事件的时间戳处于不同的时区,例如截止时间为 3:30 CET(例如布拉格时间),而事件的时间戳字段为 UTC。

这会在时区转换为夏令时时产生问题,因为需要在查询中修改截止时刻。例如。在这种情况下,如果截止时刻是 3:30 CET,在冬季它将在 2:30 UTC,在 DST 期间它将在 1:30 UTC。这意味着我必须在时间进入和离开 DST 时更改查询。

这是当前查询:

SELECT * 
FROM   my_table
WHERE  timestamp_field.after( timestamp.withtime(2,30,0,0) ) 

我想要一个强大的解决方案,它可以让我免于每隔几个月更改一次截止时间戳查询的麻烦。我可以将时区添加到查询语句本身吗?还有其他解决办法吗?

向表示 UTC 时间的事件添加事件 属性 可能会有所帮助,即将事件时间戳标准化为 UTC 并改用标准化的 属性。 查询还可以使用变量而不是硬编码数字。另一种选择可能是更改 Esper 源以采用某些 func.s

的时区

在尝试在 WHERE 语句或使用模式中尝试未成功后,我设法使用 [单行函数插件][1] 解决了这个问题。

我将截止时间、时区和事件时区传递给插件函数,并计算事件时区中的截止时间。

我的查询更改为:

SELECT * 
FROM   my_table
WHERE  timestamp_field.after( timestamp.withtime(
       eventTZHour(2, 'UTC', 'Europe/Prague'), 30, 0, 0) ) 

我在 class 中添加了 Java 实现:

public class EsperPlugins {
    public int eventTZHour(int hour, String eventTZ, String cutoffTZ) {
       // return tz calculations
    }
}

终于在esper.cfg.xml注册了插件:

<esper-configuration>
    <plugin-singlerow-function name="eventTZHour"
         function-class="EsperPlugins"
         function-method="eventTZHour"/>
</esper-configuration>

[1]: http://www.espertech.com/esper/release-5.2.0/esper-reference/html/extension.html#custom-singlerow-function 来自 esper 的文档