2012-04-09 79 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()以产生where子句的日期栏是 '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)); 

请注意,该标准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

如何从当日的日期和日期获得 – Romi 2012-04-09 13:44:17

+0

@Romi:请参阅我的更新 – 2012-04-09 14:12:07

+0

@Ken Chan非常感谢您对单个日期的日期比较进行比较。我会在解析方法中给你+1'23:59:59'。 – OO7 2015-02-02 06:22:52

1

最简单的方法是获取具有给定的一天的开始和结束日期之间的所有记录:

WHERE date BETWEEN :from AND :to 
在Java代码中

和计算fromto

为了计算午夜:

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

我知道了。天花板和截断是为了? – Romi 2012-04-09 13:45:46

+0

@Romi:您需要以某种方式计算一天的开始时间('Mon Apr 09 00:00:00 CEST 2012')及其结束日期('2009年4月23日23:59:59 CEST 2012')。 – 2012-04-09 13:48:30

+0

是的,所以天花板是在计算它? – Romi 2012-04-09 13:50:39

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

如何,做到在Hibernate的当前日期已经说过的话。你可以准备在使用Java代码Timestamp对象,例如,下面的形式给出:

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 2012-12-19 18:39:11

2

喜欢这个?

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

这会不会完全匹配? 2012-04-09不会给2012-04-09 04:02:53 ??? – Romi 2012-04-09 13:46:50

+0

如何使用Expression.between(“yourDate”,aDate,aDate + 1) – titogeo 2012-04-09 14:08:23

+0

这不适合我,我认为它确实太多了,比较日期的最佳情况是第一个答案。 – 2015-07-26 05:27:51

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

此代码是极其危险的......如果这一天是切换到你在下面的异常结束夏令时(例如1980年4月6日)!

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

年/月/日函数使用底层数据库函数(提取,...)并仅比较这些值。因此,我不需要将时间设置为0,这导致上述异常。 只是我脑海中的一个例子我是如何解决问题的!也许它有帮助