Почему вы считаете, что использование 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)