2016-03-29 44 views
0

我正在使用Esper &我需要按他們的時間戳過濾事件。事件來自外部來源。如何添加時區到Esper查詢?

挑戰在於截止時刻與事件時間戳不同,例如,截止時刻爲3:30 CET(例如布拉格時間),而事件的時間戳字段爲UTC。

由於需要在查詢中修改截止時刻,所以在時區轉換爲夏令時時會出現問題。例如。在這種情況下,如果截止時刻爲3:30 CET,冬季時間爲UTC時間2:30,DST時間爲UTC時間1:30。這意味着我必須在時間移入和移出DST時更改查詢。

這是當前查詢:

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

我想有一個強大的解決方案,將節省我改變截止時間戳查詢每隔幾個月的麻煩。我可以將時區添加到查詢語句本身嗎?還有其他解決方案嗎?

回答

0

在努力嘗試ot在WHERE caluse或使用模式做努力失敗後,我設法解決問題,使用[Single-行函數插件] [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 from esper's docs

0

將事件屬性添加到表示UTC時間的事件可能會有所幫助,即將事件時間戳標準化爲UTC,然後使用標準化屬性。 查詢也可以使用變量而不是硬編碼的數字。另一個選擇可能會改變Esper源在某個時區採取一些func.s

+0

事件的時間戳是UTC。問題是截止時刻依賴於時區。 – Amnon

+0

如果事件帶有時區,計算事件的切斷時間? – user650839

+0

不,我有一系列的事件和幾個查詢來篩選出有趣的事件。查詢具有硬編碼的截止時間,但它不包含時區,因此每6個月我必須加載更新後的查詢。我想通過在查詢中以某種方式使用時區來避免這種情況。 – Amnon