Jooq сравнивает временные метки по дням / месяцам / годам - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь выполнить сравнение меток времени с помощью jooq.Мне нужно выяснить, находятся ли 2 временные метки в тот же день / месяц / год.

Для этого в jpql я использовал методы day() / month() / year() / hour().

Я попытался использовать метод Field.compare(Comparator, Field), однако он не использует стандартный компаратор java, а вместо этого использует перечисление из Jooq.

пример этого в jpql:

SELECT s from Service s WHERE day(s.serviceDate) = day(s.createdAt) and 
month(s.serviceDate) = month(s.createdAt)

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Использование day() и month() функций

Ваше собственное решение , конечно, абсолютно правильно, но учтите, что существуют удобные методы DSL.day() иDSL.month(), который вы также можете использовать:

ctx.select()
   .from(SERVICE)
   .where(day(SERVICE.SERVICE_DATE).eq(day(SERVICE.CREATED_AT)))
   .and(month(SERVICE.SERVICE_DATE).eq(month(SERVICE.CREATED_AT)))
   .fetch();

Ваш актуальный вопрос

Однако ваш фактический вопрос был другим:

Мне нужно выяснить, находятся ли 2 временные метки в один и тот же день / месяц / год.

Возможно, вам следует указать год.В противном случае совпадут две метки времени на одну и ту же дату в разные годы, например, 2017-01-01 и 2018-01-01.Вот альтернативный вариант использования DSL.trunc():

ctx.select()
   .from(SERVICE)
   .where(trunc(SERVICE.SERVICE_DATE).eq(trunc(SERVICE.CREATED_AT)))
   .fetch();

Как всегда, вышеизложенное предполагает, что вы используете следующий статический импорт

import static org.jooq.impl.DSL.*;
0 голосов
/ 09 октября 2018

Способ сделать это - использовать метод extract и предоставить перечисление DatePart.

Например

Condition dayCondition = SERVICE.SERVICE_DATE.extract(DatePart.DAY)
  .eq(SERVICE.CREATED_AT.extract(DatePart.DAY);

Condition monthCondition = SERVICE.SERVICE_DATE.extract(DatePart.MONTH)
  .eq(SERVICE.CREATED_AT.extract(DatePart.MONTH);


dslContext.select()
    .from(SERVICE)
    .where(dayCondtion.and(monthCondition)).fetch();
...