2012-04-09 17 views
15

En mi base de datos las fechas son como 2012-04-09 04:02:532012-04-09 04:04:512012-04-08 04:04:51, etc., necesito recuperar los datos que tienen fecha actual en el campo de fecha. Quiero decir que necesito hacer coincidir solo 2012-04-09'. ¿Cómo puedo hacerlo usando los criterios de hibernación?Cómo comparar las fechas en hibernación

Respuesta

28

Uso Restrictions.between() para generar una cláusula where que la columna de la fecha es entre '2012-04-09 00:00:00' y '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)); 

Tenga en cuenta que todas las propiedades que se utilizan en la API Criteria es el nombre de la propiedad de Java, pero no el nombre real de la columna.


Actualización: Obtener fromDate y estrictas disponibles para la fecha actual utilizando sólo de 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

Cómo llegar desde fecha y hora a partir de la fecha actual – Romi

+0

@ romi: vea mis actualizaciones –

+0

@Ken Chan Gracias amigo por publicar la fecha de comparación de la fecha única. Te daré +1 por '23: 59: 59' en el método de análisis. – OO7

1

La forma más fácil es ir a buscar todos los registros que tienen fecha, entre el comienzo y el final de un día determinado:

WHERE date BETWEEN :from AND :to 

y calcular from y to en su código Java.

Para medianoches Computing:

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

No lo entiendo. techo y truncado es para? – Romi

+0

@Romi: debe calcular de alguna manera el comienzo de un día ('Lun Abr 09 00:00:00 CEST 2012') y al final (' Lun Abr 09 23:59:59 CEST 2012'). –

+0

sí, entonces el techo lo está computando ?? – Romi

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

Cómo-hacerlo en hibernación ya se ha dicho. Usted puede preparar los Timestamp objetos en el código Java utilizando, por ejemplo, la siguiente aproach:

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

de la manera convencional – Akhilesh

2

gusta esta?

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

¿Esto no hará coincidencia exacta? 2012-04-09 no dará 2012-04-09 04:02:53 ??? – Romi

+0

¿Qué le parece usar Expression.between ("yourDate", aDate, aDate + 1) – titogeo

+0

Esto no funcionó para mí, creo que hace mucho, el mejor caso para comparar fechas es la primera respuesta. –

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

Este código es extremadamente peligroso ... si el día es interruptor para el horario de verano (por ejemplo, 04/06/1980), se llega a excepción siguiente !!!

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

El/mes/día las funciones utilizan las funciones de base de datos subyacentes años (extracto, ...) y compara estos valores únicos. Por lo tanto, no necesité establecer el tiempo en 0, lo que conduce a la excepción descrita anteriormente. ¡tan solo un ejemplo de mi mente sobre cómo resolví el problema! Tal vez ayuda

Cuestiones relacionadas