Как я могу добавить часовой пояс в запросы Esper?

Я использую Esper, и мне нужно фильтровать события по временной метке. События исходят из внешнего источника.

Проблема заключается в том, что момент отсечки находится в другом часовом поясе, чем временная метка событий, например. момент отсечки — 3:30 CET (например, по пражскому времени), а поле временной метки события — UTC.

Это создает проблему при переходе часового пояса на летнее время, поскольку в запросе необходимо изменить момент отсечки. Например. в этом случае, если момент отсечки составляет 3:30 по центральноевропейскому времени, в зимнее время это будет 2:30 UTC, а во время летнего времени - 1:30 UTC. Это означает, что я должен изменить запрос, когда время переходит в летнее время и выходит из него.

Это текущий запрос:

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

Я хотел бы иметь надежное решение, которое избавит меня от необходимости менять запросы отметок времени отсечки каждые несколько месяцев. Могу ли я добавить часовой пояс в сам оператор запроса? Есть ли другое решение?




Ответы (2)


Это может помочь добавить свойство события к событию, которое представляет время UTC, т. е. нормализовать отметку времени события к UTC и вместо этого использовать нормализованное свойство. В запросе также может использоваться переменная вместо жестко заданных чисел. Другим вариантом, возможно, было бы изменить источник Esper, чтобы использовать часовой пояс для некоторых функций.

person user3613754    schedule 29.03.2016
comment
Отметка времени событий указана в формате UTC. Проблема в том, что момент отсечки зависит от часового пояса. - person Amnon; 29.03.2016
comment
Вычислить момент отсечки от события, если событие несет часовой пояс? - person user650839; 29.03.2016
comment
Нет. У меня есть поток событий и несколько запросов, чтобы отфильтровать те, которые представляют интерес. В запросах жестко запрограммировано время отсечки, но оно не включает часовой пояс, поэтому каждые 6 месяцев мне приходится загружать обновленный запрос. Я хочу избежать этого, используя часовой пояс в запросе. - person Amnon; 29.03.2016
comment
Вы также можете использовать переменную и установить новое значение переменной при изменении. - person user3613754; 31.03.2016

После безуспешных попыток сделать это в калузе WHERE или с использованием шаблона мне удалось решить проблему с помощью [плагина для однострочной функции] [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.

person Amnon    schedule 30.03.2016