Учитывая 2 LocalDateTime генерировать фильтры на основе дней или дней / часов - PullRequest
0 голосов
/ 01 ноября 2018

Я хотел бы иметь метод, который дает гранулярность временного интервала (например, ДЕНЬ, ЧАС и т. Д.) И 2 LocalDateTime a и b генерирует строку следующего типа :

давайте предположим a = '2018-01-01 12:23:23' и b = '2018-01-10 15:18:13', если заданный интервал времени равен

  • ДЕНЬ: a и b округляются до дней, и на выходе будет строка "d >= '2018-01-01' and d <= '2018-01-10"
  • HOUR => гранулярность здесь равна часу, поэтому a и b округляются до часов, и строка будет "(d == '2018-01-01' and h >= 12) or (d >= '2018-01-02' and d <= '2018-01-09') or (d == '2018-01-10 and h <= 15)"

Прямо сейчас мне нужны только эти два случая, но я хотел бы проявить гибкость (скажем, я хотел бы сделать то же самое с минутами в будущем)

Я не мог найти умный способ сделать это, например, используя класс Duration в Java, но я просто смог жестко закодировать результат для двух гранулярностей выше

1 Ответ

0 голосов
/ 01 ноября 2018

Почему вы считаете, что использование Duration для этого было бы "разумным способом"? Это не. Ваши два LocalDateTime объекта имеют все значения, необходимые для построения текстового результата.

Пример:

public enum Granularity { DAY, HOUR }
public static String toSqlCondition(LocalDateTime min, LocalDateTime max, Granularity granularity) {
    switch (granularity) {
        case DAY:
            return "d >= '" + min.toLocalDate() + "' and d <= '" + max.toLocalDate() + "'";
        case HOUR:
            return "(d == '" + min.toLocalDate() + "' and h >= " + min.getHour() + ") or " +
                   "(d >= '" + min.toLocalDate().plusDays(1) + "' and d <= '" + max.toLocalDate().minusDays(1) + "') or " +
                   "(d == '" + max.toLocalDate() + "' and h <= " + max.getHour() + ")";
        default:
            throw new UnsupportedOperationException("Cannot build SQL condition with granularity " + granularity);
    }
}

Test

LocalDateTime a = LocalDateTime.parse("2018-01-01T12:23:23");
LocalDateTime b = LocalDateTime.parse("2018-01-10T15:18:13");
System.out.println(toSqlCondition(a, b, Granularity.DAY));
System.out.println(toSqlCondition(a, b, Granularity.HOUR));

выход

d >= '2018-01-01' and d <= '2018-01-10'
(d == '2018-01-01' and h >= 12) or (d >= '2018-01-02' and d <= '2018-01-09') or (d == '2018-01-10' and h <= 15)
...