2012-01-23 14 views
7

私はデータベースにタイムスタンプを持っており、アプリケーションには日付があります。私は、休止状態が時間部分ではなく日付と一致するすべてのエントリをプルできる方法で休止状態を記述するのが好きです。例: 日付の日付部分のみをHibernateのタイムスタンプと比較する

DBのタイムスタンプで

2011-12-01午後3時14分14秒

およびアプリケーションでは、私は、デフォルトの時刻部分でありjava.util.Dateを持っています。

私の問題は、私は、コードを次のようにデータベースからエントリを検索するとき、私は何も

DetachedCriteria criteria = DetachedCriteria.forClass(MyClass.class); 
    criteria.add(Restrictions.like(TIMESTAMP_FIELD, javaUtilDate)); 
    List entries =this.getHibernateTemplate().findByCriteria(criteria); 

を取得していないようなオペレータが唯一の文字列値に使用することができ、事前

答えて

12

を(たとえば、今日から明日まで)。 私はそれをそのように使用:

YourService.java

Date fromTimestamp = new Date(); 
Date toTimestamp = new Date(); 
Date fromDate = DateHelper.getDateWithoutTime(fromTimestamp); 
Date toDate = DateHelper.getDateWithoutTime(DateHelper.getTomorrowDate(toTimestamp)); 

YourDAO.java

criteria.add(Restrictions.ge(TIMESTAMP_FIELD, fromDate)); 
criteria.add(Restrictions.le(TIMESTAMP_FIELD, toDate)); 

DateHelper.java

public static Date getDateWithoutTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    return cal.getTime(); 
} 

public static Date getTomorrowDate(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.add(Calendar.DATE, 1); 
    return cal.getTime(); 
} 

そしてもちろんの - のためのスペースが常にあるがすべてのコードでリファクタリング

4

で感謝です。それは日付に意味をなさない。

日付を持っている場合は2011-12-01(ここyyyy-MM-ddを想定)、そしてあなたは、あなたがタイムスタンプが>= 2011-12-01< 2011-12-02あるすべての行を探している、この日に自分のタイムスタンプを持つすべての行をしたいです。

だから、(一時的なCalendarオブジェクトを使用して)あなたの日付に1日を追加し、次のコードを使用しますが、日付範囲によるフィルタリングの一般的な使用のために探している場合

criteria.add(Restrictions.ge(TIMESTAMP_FIELD, javaUtilDate)); 
criteria.add(Restrictions.lt(TIMESTAMP_FIELD, javaUtilDatePlusOneDay)); 
+0

日付を文字列に変換すると、私に2011-12-11 02:00:00と表示されます。それを引くか、1日追加すると、私のクエリはもっと​​もらしい結果を引き出せません。このようにして、私は時間の部分のために指定された日の前にあるものを得るでしょう。 – Rehman

+0

適切な日付制限を使用してください。すべての時間フィールド(時、分、秒、ミリ秒)を0に設定します。これによって下限が決まります。 1日追加する。それが上限です。 –

1
if (model.getFromDOE() != null) { 
     criteria.add(Restrictions.ge("createdDate", 
       getFormattedFromDateTime(model.getFromDOE()))); 
    } 

    if (model.getToDOE() != null) { 
     criteria.add(Restrictions.le("createdDate", 
       getFormattedToDateTime(model.getToDOE()))); 
    } 

private Date getFormattedFromDateTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 
    return cal.getTime(); 
} 

private Date getFormattedToDateTime(Date date) { 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.HOUR_OF_DAY, 23); 
    cal.set(Calendar.MINUTE, 59); 
    cal.set(Calendar.SECOND, 59); 
    return cal.getTime(); 
} 
関連する問題