2012-09-18 22 views
5

Necesito poder comparar dos fechas, solo basadas en el año y el mes (es decir, sin tomar nota del día), y eso en JAVA y HQL.Comparar dos fechas basadas en el año-mes, sin tener en cuenta el día

Digamos que necesito comprobar si d1 es menor o igual a d2. Esto es lo que he intentado:

JAVA

calendar.setTime(d1); 
int y1 = calendar.get(Calendar.YEAR); 
int m1 = calendar.get(Calendar.MONTH); 
calendar.setTime(d2); 
int y2 = calendar.get(Calendar.YEAR); 
int m2 = calendar.get(Calendar.MONTH); 
return y1 <= y2 && m1 <= m2; 

HQL

select item from Item item 
where year(item.d1) <= year(:d2) 
and month(item.d1) <= month(:d2) 

El algoritmo es el mismo en las piezas tanto de código anterior, pero es equivocado:

  • 2011-10 LTE 2012-09 debería devolver true pero devolverá false porque 2011 < 2012 pero 10 !< 09

Si uso un OR en lugar de un AND, sigue siendo malo:

  • 2013-01 LTE 2012-05 deberían volver false y luego se volverá true porque 2013 !< 2012 pero 01 < 05

Entonces, ¿cómo debo procesar? Por favor, lo necesito para JAVA y HQL.

Respuesta

6

Esto debería funcionar.

select item from Item item 
where year(item.d1) < year(:d2) or 
    (year(item.d1) = year(:d2) 
     and month(item.d1) <= month(:d2)) 

Lo mismo para Java:

y1 < y2 || (y1 == y2 && m1 <= m2) 

usted podría guardar segundo cheque como y1 <= y2 pero sería un poco redundante.

+1

Hombre, por supuesto, ¡tienes razón! Gracias ';)' – sp00m

Cuestiones relacionadas