получение всех значений даты в диапазоне дат в спящем режиме - PullRequest
0 голосов
/ 26 января 2012

Мне нужно знать, как получить все даты в диапазоне дат в наборе результатов запроса Hibernate.

Это должно быть что-то похожее на следующий псевдокод в SQL

Выберите "ВСЕ ДАТЫ" из ???? где дата между TO_DATE ('date-val', 'format') и TO_DATE ('date-val', 'format').

Может потребоваться другая логика, но если я укажу диапазон, например, с 5 февраля 2011 года по 2 марта 2011 года он должен вернуть мне все даты в этом диапазоне в наборе результатов ... то есть

результат = 5 февраля 2011 г., 6 февраля 2011 г., ..... 28 февраля 2011 г., 1 марта 2011 г., 2-March-2011


Обновление: следующий запрос в Oracle дает требуемый набор результатов

select 
    d.dateInRange as dateval,
    eventdesc,
    nvl(td.dist_ucnt, 0) as dist_ucnt
from (
    select 
        to_date('03-NOV-2011','dd-mon-yyyy') + rownum - 1 as dateInRange
    from all_objects
    where rownum <= to_date('31-DEC-2011','dd-mon-yyyy') - to_date('03-NOV-2011','dd-mon-yyyy') + 1
) d
left join (
    select 
        currentdate,
        count(distinct(grauser_id)) as dist_ucnt,
        eventdesc 
    from
        txn_summ_dec

    group by currentdate, eventdesc 
) td on td.currentdate = d.dateInRange order by d.dateInRange asc

Resultset:
Date                    eventdesc       dist_cnt
2011-11-03 00:00:00     null                0
and so on..
2011-11-30 00:00:00     null                0
2011-12-01 00:00:00     Save Object         182
....
2011-12-31 00:00:00     null                0

1 Ответ

1 голос
/ 26 января 2012

Эта логика должна позаботиться о генерации диапазона:

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);
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...