web-dev-qa-db-ja.com

2つの日付間のレコードをクエリするHQL

私はSpring/HibernateアプリでHQLを使用して、Date1とDate2の間にDateAdded OR Date1とDate2の間にLastSeenがあるすべての顧客レコードをクエリしようとしているので、リポジトリにこのHQLクエリを作成しました/ DAOクラス:

sessionfactory.getCurrentSession().createQuery("from Customer c where c.dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"' OR c.lastSeenDate BETWEEN  '"+startDate+"' AND '"+endDate+"'").list();

StartDateとendDateを確認するためにアプリをデバッグしましたが、それらが次のように送信されることがわかりました。

startDate:2014年1月22日水曜日01:16:57 HKT

endDate:2014年1月29日水曜日01:16:57 HKT

DBでは、このレコードDateAddedおよびLastSeenが次のようになっているため、少なくともこのクエリを満たすレコードが1つあることを100%確信しています。

2014-01-23 15:33:38

2014-01-25 15:33:38

だから誰かが私がここで間違っている/欠けていることを教えてもらえますか?

16
MChan
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String frmDate = format.parse(startDate);
String enDate = format.parse(endDate);
sessionfactory.getCurrentSession()
.createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ")
.setParameter("stDate", frmDate)
.setParameter("edDate", enDate)
.list();

これが役立つことを願っています!

18
Ashish Jagtap

これは古い投稿ですが、誰かに役立つかもしれないと考えました。 .setTimeStampを設定するとうまくいきます。

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String frmDate = format.parse(startDate);
String enDate = format.parse(endDate); 
sessionfactory.getCurrentSession()
.createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ")
.setTimestamp("stDate", frmDate)
.setTimestamp("edDate", enDate)
.list();
6
Hans
SimpleDateFormat sf=new SimpleDateFormat("dd-MM-YYYY");
String fromDate=null;
String toDate=null;
fromDate=sf.format(startDate);
toDate=sf.format(endDate);
sessionfactory.getCurrentSession().createQuery("from Customer where dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"'");
2
Altin Vijay

BETWEENを使用する場合、「setDate」はパラメーターとして渡されたHQL日付値を切り捨て、時間、分、秒を無視することを知っておくことが重要です。これは、「setDate」を使用すると日付間隔が指定された日付の午前0時と解釈されるため、特に異なる日の日付間でHQLクエリチェックを行う場合に注意することが非常に重要です。

解決策は、「setDate」ではなく「setParameter」を使用することです。これにより、HQLの日付値が日付と時刻として解釈されます。

ここに興味がある人のための私のサイトのいくつかの例があります http://www.coding-dude.com/wp/Java/hql-date-datetime-quick-tip/

2
coding-dude.com

次のように、日付フィルターおよび日付フィールドと同じ方法で@JsonFormatで注釈を付ける必要があります。

Class Filter {
...
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
private Date startDate;
}

Class YourObject {
...

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
private Date DateAdded;
}

パターンとタイムゾーンは、地域に合わせて調整する必要があります。

0
Gui Alencar
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy");
    Calendar c = Calendar.getInstance();
    c.setTime(new Date()); // Now use today date.
    c.add(Calendar.DATE, 90);
    Date fromDate = null, toDate = null;
    String fromDateStr = formatter.format(new Date());
    String toDateStr = formatter.format(c.getTime());
    try {
        fromDate = formatter.parse(fromDateStr);
        toDate = formatter.parse(toDateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    query.setParameter("stDate", fromDate);
    query.setParameter("edDate", toDate);
0
user9260527

同様の問題がありました。終了日(1月29日水曜日)を使用する場合、システムは1月29日水曜日00:00:00を検索します。これは1月28日を選択するのと同じです。これは、開始日に問題がない理由も説明しています。

驚くべきことに、休止状態の基準を使用する場合、この問題は存在しません。

0
MR AND