2011-10-28 118 views
3

我有一個奇怪的現象:爲什麼我不能將java.util.Date與mysql日期進行比較?

我使用JPA /休眠從MySQL數據庫表,其中一個日期列是大於或等於我發送的日期得到行(去掉了不相關的代碼):

SELECT sp.* FROM spaceproduct sp where sp.enddate is null or sp.enddate >= :endDate) 

在我的代碼我基本上做到:

q.setParameter("endDate", new java.util.Date()); 

現在,我的問題是,當在DB的日期是同一天。即「今天」,它不會被拾起。我認爲這是因爲它不知何故也將java.util.date的時間部分與數據庫中的內容進行比較(db值僅爲「2011-10-28」,但java.util Date爲2011-10-28T13:36 :43.130 + 0200)

不過,如果我更改日期參數i設置成java.sql.Date(),它的工作原理

。現在,因爲我的MySQL數據庫列是一個日期,而不是!一個日期時間,這是一個錯誤?即使我發送一個java.util.date,不應該只比較日期部分,因爲我的數據庫列是日期嗎?

編輯:我試過使用util日期並將其轉換爲一個sql日期,但實際上並不起作用:

java.util.Date utilDate = new java.util.Date(); 
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime()); 
q.setParameter("endDate", sqlDate); 

因此,從我所看到的,我的部分時間設置爲0,也爲SQL的日期,除非我用的是過時「年 - 月 - 日」構造...

+0

不,這不是一個錯誤。 2011-10-28不是> = 2011-10-28T13:36:43.130 + 0200。你的日期對象有2011-10-28T13:36:43.130 + 0200,因此失敗。然而,java.sql.Date只存儲日/月/年,或者只是在你調用toString()時返回,所以它等於2011-10-28。 – Thor84no

+0

嘿,感謝您的輸入。看到我上面的編輯評論,並說出你認爲隊友 – Mathias

回答

3

您可以使用System.currentTimeMillis()而不是創建util Date來獲得那麼長的時間。然而,如果沒有,我會希望你的編輯代碼能夠正常工作,但是如果沒有其他選擇,只能以某種方式丟棄小時/分鐘/秒/毫秒,例如System.currentTimeMillis() % 24 * 60 * 60 * 1000(當然最好將它存儲在常量中,但更好它得到了點)。或者你可以使用喬達。

+0

是的,謝謝,我結束了使用jodatime的DateMidnight ... – Mathias

1

您應該使用java.sql.Date,因爲這純粹是一個日期並且不包含時間信息。 它與java.util.Date協同工作的原因是,數據庫或JDBC驅動程序將列從DATE擴展到TIMESTAMP(00:00:00時間部分),以使比較對參數起作用。

+0

順便說一句。 java.sql.Date extends java.util.Date – stacker

+0

Mark,謝謝你的想法。然而,我用sql-dates的主要牛肉是任何「全日制」構造函數,即年份 - 月份日期,已被棄用。你應該基本上使用長構造函數,然後我可以使用JodaTime「datemidnight」來代替......你有更好的主意嗎? – Mathias

+0

堆棧器,馬克,請看我上面的編輯... – Mathias

相關問題