Math.min(v, checkedCast(dateUnit.getTemporalUnit().between(start, end))));
dateUnit.getTemporalUnit().getDuration().toMillis(),
dateUnit.name().toLowerCase(ENGLISH), TIMESTAMP_FORMATTER.format(startDate.atStartOfDay()),
dateUnit.name().toLowerCase(ENGLISH), TIMESTAMP_FORMATTER.format(endDate.atStartOfDay()),
dateUnit.name().toLowerCase(ENGLISH))));
} else {
query = format("select %s, collect_retention(bits) from (\n" +
dateUnit.getTemporalUnit().getDuration().toMillis(),
dimension.map(v -> " and first.dimension = ret.dimension").orElse(""),
dimension.map(v -> "").orElseGet(() -> String.format("cross join (select generate_series(date_trunc('%s', date '%s'), date_trunc('%s', date '%s'), interval '1 %s')::date date) dates",
dateUnit.name().toLowerCase(ENGLISH), TIMESTAMP_FORMATTER.format(startDate.atStartOfDay()),
dateUnit.name().toLowerCase(ENGLISH), TIMESTAMP_FORMATTER.format(endDate.atStartOfDay()),
dateUnit.name().toLowerCase(ENGLISH))));