2016-03-29 19 views
0

Ich benutze Esper & Ich muss Ereignisse nach ihrem Zeitstempel filtern. Die Ereignisse kommen von einer externen Quelle.Wie kann ich Esper-Abfragen eine Zeitzone hinzufügen?

Die Herausforderung besteht darin, dass der Abschaltzeitpunkt sich in einer anderen Zeitzone befindet als der Zeitstempel des Ereignisses, z. der Cut-off-Zeitpunkt ist um 3:30 Uhr MEZ (z. B. Prager Zeit), während das Zeitstempelfeld des Ereignisses um UTC ist.

Dies wirft ein Problem auf, wenn die Zeitzone in die Sommerzeit verschoben wird, da der Cutoff-Zeitpunkt in der Abfrage geändert werden muss. Z.B. In diesem Fall, wenn der Cut-off-Zeitpunkt 3:30 Uhr MEZ ist, ist es im Winter um 2:30 Uhr UTC und während der Sommerzeit um 1:30 Uhr UTC. Das bedeutet, dass ich die Abfrage ändern muss, wenn sich die Zeit in DST verschiebt.

Dies ist die aktuelle Abfrage:

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

Ich mag würde eine robuste Lösung, die mir den Aufwand des Wechsels die Cutoff-Zeitstempel speichern werden alle paar Monate Abfragen. Kann ich die Zeitzone zur Abfrage selbst hinzufügen? Gibt es eine andere Lösung?

Antwort

0

Nachdem ich erfolglos mit dem Versuch, es in der WHERE caluse oder mit einem Muster zu tun, zu kämpfen, gelang es mir, das Problem zu lösen mit einem [Single- Zeilenfunktions-Plugin] [1].

Ich übergebe die Plugin-Funktion die Cutoff-Stunde, Zeitzone & Event Zeitzone und berechnen Sie die Cutoff-Stunde in der Zeitzone des Ereignisses.

Meine Anfrage geändert:

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

ich die Java-Implementierung in einer Klasse hinzugefügt:

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

und registriert schließlich das Plugin in 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 von esper's docs

0

Es kann hilfreich sein, dem Ereignis, das die UTC-Zeit darstellt, eine Ereigniseigenschaft hinzuzufügen, d. H. Den Ereigniszeitstempel auf UTC zu normalisieren und stattdessen die normalisierte Eigenschaft zu verwenden. Die Abfrage könnte auch eine Variable anstelle der fest codierten Zahlen verwenden. Eine andere Option wäre vielleicht, die Esper-Quelle zu ändern, um eine Zeitzone für einige Funktionen zu verwenden.

+0

Der Zeitstempel der Ereignisse ist in UTC angegeben. Das Problem ist, dass der Cutoff-Zeitpunkt zeitzonenabhängig ist. – Amnon

+0

Berechnen Sie den Cut-Off-Zeitpunkt aus dem Ereignis, wenn das Ereignis die Zeitzone enthält? – user650839

+0

Nein. Ich habe einen Strom von Ereignissen und mehrere Abfragen, um diejenigen herauszufiltern, die von Interesse sind. Bei den Abfragen ist die Sperrzeit fest codiert, aber die Zeitzone ist nicht enthalten. Daher muss ich alle 6 Monate eine aktualisierte Abfrage laden. Ich möchte das vermeiden, indem ich die Zeitzone irgendwie in der Abfrage verwende. – Amnon