2009-07-28 9 views
1

Ich versuche, HQL zu verwenden, um Datensätze zu finden, bei denen zwei Datumsfelder innerhalb eines Monats voneinander liegen.Verwenden von Hibernate HQL zum Auswählen von Datensätzen mit zwei Datumsangaben innerhalb eines angegebenen Intervalls

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

Leider scheint die verwendete Datenbank Intervall nicht zu verstehen.

Wie kann ich das Intervall zwischen zwei Datumsfeldern vergleichen?

Antwort

2

Muss es ein Kalendermonat sein? Ich fürchte, es gibt in diesem Fall keine gute HQL-Lösung. Das nächste, was Sie bekommen, ist:

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

month() ist ANSI SQL-Funktionen und so sollte hoffentlich durch die Datenbank-Engine unterstützt werden (übrigens, was Datenbank ist das?) Zweite Bedingung ist erforderlich Fälle auszusortieren, wo active_date ist Letzter Tag des Vormonats und kickoff_meeting_date ist der erste Tag des nächsten Monats mit einem dazwischen liegenden Monat von weniger als 31 Tagen.
Sie können dies weiter ausdehnen, um Zeit zu behandeln, wenn Sie benötigen. Letztendlich sind Sie jedoch besser daran, ungefähre Ergebnisse zu erhalten und sie in Ihrem Code erneut zu überprüfen/zu filtern.

+0

Ausgezeichnet, das scheint für meine Bedürfnisse zu funktionieren. Es handelt sich um eine Rational ClearQuest-Datenbank, die auf MS SQLServer ausgeführt wird. Aber ich hatte gehofft, es datenbankneutral zu halten und ein wenig vertrauter mit HQL zu werden. Vielen Dank! – Richard

+0

Wenn richtig verstanden, war die Anforderung "innerhalb eines Monats" von zwei Daten ... die Verwendung von Werten wie 31 wird nicht korrekt funktionieren, da einige (Gregorian Kalender) Monate 28 - 31 Tage haben. Darüber hinaus gibt es je nach Tageszeit noch mehr Möglichkeiten, auszusteigen. –

0

Leider ist JPQL noch nicht ganz da. Um zwei Datumsfelder genau zu vergleichen, wird eine Abfrage benötigt, um die fraglichen Entitäten in Java/JPA-Objekttypen (DATE oder TIMESTAMP) zu bringen und sie dann zu vergleichen (wobei die Empfehlung die Java-Kalender- oder JodaTime-Kalenderklassen verwendet). Einmal dort, subtrahiert man einen Monat von einem der Kalender und vergleicht dann die Differenz (in Tagen, Stunden usw.) zwischen den beiden, wird ein genaues Ergebnis erhalten. Siehe Methoden Java Calendar.add() und Calendar.before() oder after().

Verwandte Themen