在休眠日期范围内获取所有日期值

时间:2012-01-25 23:57:24

标签: java hibernate

我需要知道如何在Hibernate查询结果集中获取日期范围内的所有日期。

它应该类似于SQL

中的以下伪代码
  

从????中选择“所有日期”其中的日期   TO_DATE('date-val','format')和TO_DATE('date-val','format')。

这可能需要一些不同的逻辑,但如果我给出一个范围,如2011年2月5日到2011年3月2日 它应该返回结果集中该范围内的所有日期... 即

  

结果集= 2011年2月5日,2011年2月6日,2011年2月28日,2011年3月1日,   2日至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 个答案:

答案 0 :(得分:1)

这个逻辑应该负责生成范围:

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

我希望这会有所帮助。