2016-11-30 65 views
0

我正在使用Hibernate 4.3.8.Final,Primefaces 6.0和MySQL Database 5.7.13。 我有一個表與這種結構的數據庫:SQL中的錯誤日期選擇

CREATE TABLE `rents` ( 
`rent_code` INT NOT NULL AUTO_INCREMENT, 
`rent_daystart` datetime default NULL, 
`rent_dayend` datetime default NULL, 
PRIMARY KEY (`rent_code`) 
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

並與松鼠提取與下面的SQL以下數據:

select * from rents 

rent_code | rent_daystart   | rent_dayend 
1   | 2016-11-30 16:03:00.0 | 2016-12-01 16:03:00.0 

在我的Java bean,我有以下功能:

public List<Object> getRents(java.util.Date iniDate, java.util.Date endDate){ 
     String SQL="select rent_code from rents where rent_daystart < :inidate and rent_dayend > :enddate"; 
     List<Object> allRecords = null; 
     Session sesion=HibernateUtil.getSessionFactory().openSession(); 
     try {  
      sesion.beginTransaction(); 
      Query query = sesion.createSQLQuery(SQL).setDate("inidate", iniDate).setDate("enddate", endDate); 
      allRecords = query.list(); 
      sesion.getTransaction().commit(); 
      sesion.close();         
     } 
      catch (HibernateException he) { 
      //exception control code 
      }; 
      return allRecords; 
} 

我執行網絡APP調試和功能接收的日期是:

**inidate** = 'Wed Nov 30 17:54:00 CET 2016' 

**enddate** = 'Wed Nov 30 18:54:00 CET 2016' 

並且它不返回任何記錄。

如果我松鼠那樣執行相同的SQL:

select rent_code from rents where rent_daystart < '2016-11-30 17:54:00' and rent_dayend > '2016-11-30 18:54:00' 

它返回一個記錄。

我懷疑這是一個數據類型問題或類似的問題,但經過在網絡上的研究後,我不清楚。

有人可以幫我嗎?

在此先感謝!

+0

如果您使用的是日誌框架,請嘗試啓用Hibernate [SQL級日誌記錄](http://stackoverflow.com/a/2536835/1255737)以確保其實際執行您認爲的查詢。 – rmlan

回答

0

java.util.Date類不處理時區。除非您在Date實例和數據庫字段中使用相同的時區,否則很容易使創建您所看到的行爲的時區不匹配。嘗試並以UTC格式顯示java日期,然後以UTC格式查看數據庫日期,並查看它們是否按照您的預期排列。

+0

我從來沒有處理日期時區或simillar,我有點溢出,因爲所有的數據,我必須asimilate。在閱讀一些文檔(https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html)後,我的第一個問題是:如果我正確理解MySQL中的DATETIME不存儲時區,當檢索這樣的值是一些時區添加?如果價值恢復「原樣」,以便他們之間進行完美的比較,我應該簡單地按照阿米什拉的說法來格式化日期? –

+0

以下是您可以閱讀有關mysql時區的地方:http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html –

+0

由於您傳遞的是Date對象而不是字符串,因此格式設置爲這一點是無關緊要的。只要確保你傳遞的日期是正確的。由於您沒有向我們展示您用於將日期傳遞給方法的代碼,因此我們無法告訴您它是否正確。 –

0

如果是從代碼中傳遞的值,並預計將在數據庫中,然後使用SimpleDateFormat的傳遞到DATABSE

SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
Date date = dt.parse(iniDate); 
0

好之前更改日期值的格式值之間的日期格式不匹配,我發現了這個問題。正如Compare Date Java to DateTime Column in database table using SQL中所述,我使用「.setDate」函數來設置日期,這樣的函數會截斷時間部分,這就是問題所在。現在我正在使用同時使用日期和時間部分的「.setTimestamp」。 感謝大家的幫助,我學到了很多關於時區的知識!