2012-04-09 2 views
15

На моей дате создания базы данных 2012-04-09 04:02:532012-04-09 04:04:512012-04-08 04:04:51 и т. Д. Мне нужно получить данные с текущей датой в поле даты. Я имею в виду, мне нужно соответствовать только 2012-04-09'. Как я могу это сделать, используя критерии спящего режима.Как сравнить даты в hibernate

ответ

28

Использование Restrictions.between() для генерации где предложение, которое столбец даты находится между '2012-04-09 00:00:00' и «2012-04-09 23:59:59'

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date fromDate = df.parse("2012-04-09 00:00:00"); 
Date toDate = df.parse("2012-04-09 23:59:59"); 

criteria.add(Restrictions.between("dateField", fromDate, toDate)); 

Пожалуйста, обратите внимание, что все свойства, используемые в Criteria API является имя свойства Java, но не фактическое имя столбца.


Обновление: Получить FromDate и Todate на текущую дату с использованием JDK только

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
Date fromDate = calendar.getTime(); 

calendar.set(Calendar.HOUR_OF_DAY, 23); 
calendar.set(Calendar.MINUTE, 59); 
calendar.set(Calendar.SECOND, 59); 
Date toDate = calendar.getTime(); 

criteria.add(Restrictions.between("dateField", fromDate, toDate)); 
+0

Как получить fromDate и toDate от Currentdate – Romi

+0

@Romi: см. Мои обновления –

+0

@Ken Chan Спасибо большое, что вы отправили дату сравнения одной даты. Я дам вам +1 для '23: 59: 59' в методе анализа. – OO7

1

Самый простой способ, чтобы извлечь все записи с даты между началом и концом данного дня:

WHERE date BETWEEN :from AND :to 

И вычислить from и to в коде Java.

для вычисления Midnights:

import static org.apache.commons.lang.time.DateUtils.ceiling; 
import static org.apache.commons.lang.time.DateUtils.truncate; 

Date someDay = new Date(); 
Date from = truncate(someDay, Calendar.DAY_OF_MONTH); 
Date to = new Date(ceiling(someDay, Calendar.DAY_OF_MONTH).getTime() - 1); 
+0

i dint получить его. потолок и усечение? – Romi

+0

@Romi: вам нужно как-то вычислить начало дня ('Mon Apr 09 00:00:00 CEST 2012') и конец его (' Mon Apr 09 23:59:59 CEST 2012'). –

+0

да, поэтому потолок вычисляет его ?? – Romi

0
Restrictions.between("dateColumn", midnight1, midnight2) 
0

Как-сделать это в Hibernate уже было сказано. Вы можете подготовить Timestamp объекты в коде Java, используя, например, следующий ПОДХОД:

Calendar cFrom = Calendar.getInstance(); 
cFrom.setTime(new Date()); /* today */ 
cFrom.set(Calendar.HOUR_OF_DAY, 0); 
cFrom.set(Calendar.MINUTE, 0); 
cFrom.set(Calendar.SECOND, 0); 
cFrom.set(Calendar.MILLISECOND, 0); 
Timestamp from = new Timestamp(cFrom.getTime().getTime()); 
Calendar cTo = Calendar.getInstance(); 
cTo.setTime(new Date()); /* today */ 
cTo.set(Calendar.HOUR_OF_DAY, 23); 
cTo.set(Calendar.MINUTE, 59); 
cTo.set(Calendar.SECOND, 59); 
cTo.set(Calendar.MILLISECOND, 999); 
Timestamp to = new Timestamp(cTo.getTime().getTime()); 

final String QUERY = "" 
    + "SELECT tr " 
    + "FROM Type tr " 
    + "WHERE tr.timestamp >= :timestampFrom AND tr.timestamp <= :timestampTo"; 
Query query = entityManager.createQuery(QUERY); 
query.setParameter("timestampFrom", from); 
query.setParameter("timestampTo", to); 
@SuppressWarnings("unchecked") 
List<Type> ts = (List<Type>)query.getResultList(); 
+0

обычный способ – Akhilesh

2

как это?

criteria.add(Expression.eq("yourDate", aDate)) 
+0

это не сделает точное совпадение ?? 2012-04-09 wil не дает 2012-04-09 04:02:53 ??? – Romi

+0

Как насчет использования выражения Expression.between («yourDate», aDate, aDate + 1) – titogeo

+0

Это не сработало для меня, я думаю, что он делает точный выбор, лучший случай сравнить даты - это первый ответ. –

0
The following code will work 

Calendar fromDate = Calendar.getInstance(); 
fromDate.setTime(new Date()); 
fromDate.set(Calendar.HOUR_OF_DAY, 0); 
fromDate.set(Calendar.MINUTE, 0); 
fromDate.set(Calendar.SECOND, 0); 
fromDate.set(Calendar.MILLISECOND, 0); 

Calendar toDate = Calendar.getInstance(); 
toDate.setTime(new Date()); 
toDate.set(Calendar.HOUR_OF_DAY, 23); 
toDate.set(Calendar.MINUTE, 59); 
toDate.set(Calendar.SECOND, 59); 
toDate.set(Calendar.MILLISECOND, 999); 

criteria.add(Restrictions.between("loadDate", fromDate.getTime(), 
        toDate.getTime())); 
2
fromDate.setTime(new Date()); 
fromDate.set(Calendar.HOUR_OF_DAY, 0); 
fromDate.set(Calendar.MINUTE, 0); 
fromDate.set(Calendar.SECOND, 0); 
fromDate.set(Calendar.MILLISECOND, 0); 

Этот код является чрезвычайно опасно ... если день переход на летнее время (например, 06.04.1980), вы в конечном итоге в следующем исключение !!!

java.lang.IllegalArgumentException: HOUR_OF_DAY: 0 -> 1day 


HQL: from human pat where year(pat.birthdate) = :start_day and month(pat.birthdate) = :start_month and year(pat.birthdate) = :start_year "); 

params.put("start_day", startDate.get(Calendar.DAY_OF_MONTH)); 
params.put("start_month", startDate.get(Calendar.MONTH) + 1); 
params.put("start_year", startDate.get(Calendar.YEAR)); 

год/месяц/день функции использовать основные функции Db (экстракт, ...) и сравнивает только эти значения. Поэтому мне не нужно было устанавливать время на 0, что приводит к описанному выше исключению. просто пример из моего ума, как я решил проблему! Может быть, это помогает