【问题标题】:How can I add timezone to Esper queries?如何将时区添加到 Esper 查询?
【发布时间】:2016-03-29 10:00:12
【问题描述】:

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

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

这会在时区切换到夏令时时产生问题,因为需要在查询中修改截止时刻。例如。在这种情况下,如果截止时间是欧洲中部时间 3:30,那么在冬季时间它将是 2:30 UTC,而在 DST 期间它将是 1:30 UTC。这意味着当时间移入和移出 DST 时,我必须更改查询。

这是当前查询:

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

我希望有一个强大的解决方案,可以省去每隔几个月更改截止时间戳查询的麻烦。我可以将时区添加到查询语句本身吗?有没有其他解决办法?

【问题讨论】:

    标签: timezone timezone-offset complex-event-processing esper timestamp-with-timezone


    【解决方案1】:

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

    【讨论】:

    • 事件的时间戳是 UTC。问题是截止时间取决于时区。
    • 如果事件带有时区,则计算事件的截止时刻?
    • 没有。我有一个事件流和几个查询来过滤掉感兴趣的事件。查询具有硬编码的截止时间,但它不包括时区,因此每 6 个月,我必须加载更新的查询。我想通过在查询中以某种方式使用时区来避免这种情况。
    • 你也可以使用一个变量,当有变化时设置一个新的变量值。
    【解决方案2】:

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

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

    我的查询改为:

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

    我在一个类中添加了 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 的文档

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多