2011-11-17 9 views
5

Necesito seleccionar algunas entidades usando el filtrado HQL por tiempo. Pero necesito comparar solo el componente de fecha sin tiempo. Por ejemplo, 1.1.2011 12.00 y 1.1.2011 13.20 deben ser iguales.Comparar solo el componente de fecha en HQL

¿Qué operador puedo usar?

@Query("FROM Item item " + 
    "WHERE item.date [equality by date operator] :date ") 
List<Item> findByDate(@Param("date") Date date); 

Respuesta

8

Si no le molestan las funciones específicas de DB, podría hacer esto (usando Oracle como ejemplo).

@Query("FROM Item item WHERE trunc(item.date) = trunc(:date) ") 
List<Item> findByDate(@Param("date") Date date); 

Se puede usar esta porque el OracleDialect registra trunc como StandardSQLFunction y Oracle de TRUNC elimina el componente de tiempo de una fecha.

+0

En Oracle para evitar errores puede llamar a 'trunc (item.date, 'YYYY')' para evitar algunos errores. –

9

Si lo hace la mente las funciones DB-específicos (y debe) luego trabajar con 2 fechas:

  1. partir de la fecha = fecha con el tiempo establecido en la medianoche
  2. hasta la fecha = fecha con el tiempo ajustado en 23: 59: 59,999

entonces se le pregunta por las fechas> = de la fecha y hasta la fecha < =

+0

Estoy usando Oracle DB y es mejor que use trunc. Tnx para nuestra respuesta – hatesms

+3

Bien, pero si quiere probar la unidad con una base de datos en memoria donde esto no es compatible, se quedará bloqueado. –

0
"Select col from Table t where t.date = CURRENT_DATE()" 

intente esto.

Cuestiones relacionadas