2009-07-28 8 views
1

J'essaie d'utiliser HQL pour trouver des enregistrements où deux champs de date sont dans un mois l'un de l'autre.Utiliser Hibernate HQL pour sélectionner des enregistrements où deux dates sont dans un intervalle spécifié

Query query = session.createQuery("from com.ep.cqprojects.db.Projects " 
    + "where active_date - kickoff_meeting_date < interval '1' month "); 

Malheureusement, la base de données utilisée ne comprend apparemment pas l'intervalle.

Comment puis-je comparer l'intervalle entre deux champs de date?

Répondre

2

Est-ce que ce doit être un mois civil? Je crains qu'il n'y ait pas de bonne solution HQL seulement dans ce cas. La chose la plus proche, vous pouvez obtenir est:

from com.ep.cqprojects.db.Projects 
where active_date - kickoff_meeting_date < 31 
    and month(active_date) - month(kickoff_meeting_date) < 2 

month() est ANSI fonctions SQL et ainsi, espérons-devrait être pris en charge par votre moteur de base de données (soit dit en passant, quelle base de données est que?) La deuxième condition est nécessaire pour éliminer les cas où active_date est le dernier jour du mois précédent et est le premier jour du mois prochain avec un mois entre eux inférieur à 31 jours.
Vous pouvez étendre cette fonction pour gérer le temps si vous en avez besoin. En fin de compte, cependant, vous feriez mieux d'obtenir des résultats approximatifs et de les re-vérifier/filtrer dans votre code.

+0

Excellent, cela semble bien fonctionner pour mes besoins. C'est une base de données Rational ClearQuest s'exécutant sur MS SQLServer. Mais j'espérais garder la base de données neutre et me familiariser un peu avec HQL. Merci! – Richard

+0

Si on le comprend correctement, l'exigence était «dans un mois» de deux dates ... l'utilisation de valeurs comme 31 ne fonctionnera pas avec précision car certains mois (calendrier grégorien) ont 28 - 31 jours. De plus, en fonction de l'heure de la journée, il y a encore plus de potentiel pour être au large. –

0

Hélas, JPQL n'est pas encore là. Pour comparer deux champs de date avec précision, une requête est nécessaire pour mettre en relation les entités en question (DATE ou TIMESTAMP) avec les types d'objets Java/JPA puis les comparer (avec la recommandation d'utiliser le calendrier Java ou JodaTime). Une fois sur place, soustraire un mois de l'un des calendriers et ensuite comparer la différence (en jours, heures, etc.) entre les deux donnera un résultat précis. Voir les méthodes Java Calendar.add() et Calendar.before() ou after().

Questions connexes