2014-09-05 14 views
10

Muszę porównać dwie daty w kwerendzie hibernacji hql. Używam java.util.Date w moim java bean i przy użyciu timestamp jako typ danych w bazie danych mysql.Data Porównaj w HQL bez timestamp

Powyższe zapytanie porównuje czas z datą. Co powinienem zrobić, aby porównać datę w powyższym zapytaniu bez czasu.

Odpowiedz

13

Zobacz dokumentacji Hibernate dostępnych aktualnych funkcji

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

w punkcie 14.10 powiadomienia ta linia

second(...), minute(...), hour(...), day(...), month(...), and year(...) 

Tak to powinno działać

... where year(t.endDate) > year(t.startDate) 
    and month(t.endDate) > month(t.startDate) 
    and day(t.endDate) > day(t.startDate) 

Rozwiązanie zgłoszone jako satysfakcjonujące pytanie to:

... where DATE(t.endDate) > (t.startDate) 
+0

To daje mi porównanie z miesiącem i rokiem oddzielnie ... ale muszę porównać ** pełną datę ** w czasie jak * * 06-09-2014 ** –

+2

Działa z następującą zmianą ** gdzie DATE (t.endDate)> (t.startDate) ** –

+0

Cieszę się, że to działało dla ciebie. Redaguję odpowiedź za pomocą twojego rozwiązania, zamiast zostawiać rozwiązanie w komentarzach. To jest sposób działania Stackoverflow. – carbontax

0

Proponowane rozwiązanie z funkcją date() nie wydaje się być czysty SQL i nie działa dla mnie (za pomocą SQL Server). Oryginalne rozwiązanie (porównywanie dnia, miesiąca i roku z osobna) jest krokiem we właściwym kierunku, ale nie można tego zrobić w ten sposób, ponieważ na przykład data w przyszłości, dzień nie musi być większy, jeśli miesiąc jest większy, itd. Następujący SQL powinien działać:

(year(t.endDate) > year(t.startDate)) 
or 
(year(t.endDate) = year(t.startDate) 
    and 
    month(t.endDate) > month(t.startDate)) 
or 
(year(t.endDate) = year(t.startDate) 
    and 
    month(t.endDate) = month(t.startDate) 
    and 
    day(t.endDate) > day(t.startDate))