Эта логика должна позаботиться о генерации диапазона:
public static List<Date> dayRange(Date begin, Date end) {
if (end.before(begin)) {
throw new IllegalArgumentException("Invalid range");
}
final List<Date> range = new ArrayList<>();
final Calendar c1 = extractDate(begin);
final Calendar c2 = extractDate(end);
while (c1.before(c2)) {
range.add(c1.getTime()); // begin inclusive
c1.add(Calendar.DATE, 1);
}
range.add(c2.getTime()); // end inclusive
return range;
}
private static Calendar extractDate(Date date) {
final Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
return c;
}
Не так красиво и лаконично, как Joda Time, но заставляет вас двигаться.результаты запроса с нулями для дат без результатов, запустите исходный запрос, сгруппированный по дате (без левого соединения), а затем заполните пропущенные даты.Предполагая, что ваш запрос возвращает Map<String, Long>
:
final DateFormat df = new SimpleDateFormat("d-MMM-yyyy", Locale.US);
final Date begin = df.parse("5-Feb-2011");
final Date end = df.parse("2-March-2011");
final List<Date> range = dayRange(begin, end);
final Map<String, Long> result = // code to execute your query
for (Date date: range) {
String key = df.format(date);
if(!result.containsKey(key)) {
result.put(key, 0l);
}
}
Надеюсь, это поможет.