HQL запрашивает записи между двумя датами

Я пытаюсь запросить все записи клиентов с помощью HQL в моем приложении Spring/Hibernate, которое имеет DateAdded между Date1 и Date2 или LastSeen между Date1 и Date2, поэтому я построил этот запрос HQL в классе Repository/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: ср 22 янв 01:16:57 HKT 2014

endDate: Wed Jan 29 01:16:57 HKT 2014

В БД я на 100% уверен, что есть одна запись, по крайней мере удовлетворяющая этому запросу, так как эта запись DateAdded и LastSeen выглядит следующим образом:

2014-01-23 15:33:38

2014-01-25 15:33:38

Так может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно/отсутствует здесь?

Ответ 1

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

надеюсь, что это поможет!

Ответ 2

Это старый пост, но я подумал, что это может помочь кому-то. Установка .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();

Ответ 3

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+"'");

Ответ 4

У меня была аналогичная проблема. Когда мы используем дату окончания (ср. 29 января), система ищет ср. 29 января 00:00:00, что похоже на выбор 28 января. Чтобы избежать такого случая, мы можем добавить один день до даты окончания. Это также объясняет, почему у нас нет проблемы с датой начала.

Удивительно, но эта проблема не существует, когда мы используем критерии спящего режима.

Ответ 5

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

Ответ 6

Попробуйте что-то вроде этого:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date fromDate = df.parse(startDate);
Date toDate = df.parse(endDate);
Criteria criteria = sessionfactory.getCurrentSession().createCriteria(Customer.class)
   .add(Restrictions.between("dateAdded", fromDate , toDate ));
List<Customer> listCustomer = criteria.list();

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