2012-01-25 125 views
0

我需要知道如何獲取Hibernate查詢結果集中日期範圍內的所有日期。在休眠日期範圍內獲取所有日期值

應該在SQL

選擇「所有日期」類似於下面的僞代碼的東西???? (date-val','format')和TO_DATE('date-val','格式')之間的日期爲 。

它可能需要一些不同的邏輯,但如果我給一個系列,如5月 - 2011年2日至2011年 它應該返回我的所有日​​期在該範圍在結果...... 即

結果集= 5-FEB-2011,6-FEB-2011,..... 28-FEB-2011,1日至2011年, 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 
+0

你真的需要用Hibernate來做到這一點嗎?聽起來像是與持久性無關的Java邏輯工作。標準API [日曆](http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html)或[Joda Time](http://joda-time.sourceforge.net/ )都能很好地滿足要求。 –

+0

我也可以使用Java,只是爲了清除這個目的,最後我想對此結果集進行左連接,使用範圍內的不同用戶數,按日期分組,以便記錄結果集中的所有日期(即使日期不計算在內) –

回答

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

不一樣漂亮和簡潔爲約達時間,而是讓你去。

如果您只需要在不帶結果的日期顯示帶有零的查詢結果,請運行按日期分組的原始查詢(不帶左連接),然後填寫缺失的日期。假設您的查詢返回一個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); 
    } 
} 

我希望這會有所幫助。

+0

這是一個很好的框架,但它缺少最重要的部分 - 「執行查詢的代碼」。現在我已經設法使基於Oracle的Query直接在結果集中獲得所需的結果 - 不需要任何代碼來修改結果集,現在只需將其轉換爲HQL/criteria api即可!請查看帖子 –

+0

@pri_dev的更新,我的角度在於你不需要查詢的前半部分。只需執行第二部分 - 在左連接之後(如果您有將映射到HQL的問題,請閱讀[here](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html #queryhql-grouping)),將結果提取到一個Map(如果您在將結果提取到Map中時遇到問題,請閱讀[這裏](http://stackoverflow.com/questions/4736743/with-hibernate-how-can-i -query-a-table-and-return-a-hashmap-with-key-value-pair))並使用我的代碼添加缺失的日期。這是否清除它? –

+0

讓我試試 –