我正在使用Esper&我需要按时间戳过滤事件。这些事件来自外部。
挑战在于,截止时刻与事件的时间戳在不同的时区,例如,截止时刻在欧洲中部时间3:30(例如布拉格时间),而事件的时间戳记字段在UTC。
当时区转换为夏令时时,这会带来问题,因为需要在查询中修改截止时刻。例如,在这种情况下,如果截止时间是欧洲中部时间3:30,那么在冬季,截止时间是协调世界时2:30,在夏令时,截止时间为协调世界时1:30。这意味着当时间转换为夏令时和夏令时之外时,我必须更改查询。
这是当前的查询:
SELECT *
FROM my_table
WHERE timestamp_field.after( timestamp.withtime(2,30,0,0) )
我希望有一个强大的解决方案,可以省去每隔几个月更改一次截止时间戳查询的麻烦。我可以将时区添加到查询语句本身吗?还有其他解决方案吗?
将事件属性添加到表示UTC时间的事件中可能会有所帮助,即将事件时间戳规范化为UTC,然后使用规范化属性。查询也可以使用变量而不是硬编码的数字。另一种选择可能是更改Esper源,以获取某些函数的时区。s
在WHERE caluse中尝试或使用Pattern失败后,我使用[Single Row Function plugin][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-esper文档中的单行函数