2016-11-30 25 views
0

私はHibernate 4.3.8.Final、Primefaces 6.0、およびMySQL Database 5.7.13で作業しています。 私はこのような構造を持つデータベース内のテーブルがあります。SQLで間違った日付選択

:私は、以下の機能を持っている私のJava Beanでは

select * from rents 

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

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でリスで抽出し、以下のデータを

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' 

そして、NO RECORD AT ALLを返します。

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

それは1つのレコードが返されます、私は方法がリスに同じSQLを実行した場合

これはデータ型の問題などと思われますが、Webで調査した結果、私には分かりません。

私を助けてもらえますか?

ありがとうございます!

+0

ロギングフレームワークを使用している場合は、Hibernate [SQLレベルロギング](http://stackoverflow.com/a/2536835/1255737)をオンにして、実際にクエリを実行しているかどうかを確認してください。 – rmlan

答えて

0

java.util.Dateクラスはタイムゾーンを処理しません。 Dateインスタンスとデータベースフィールドの両方で同じタイムゾーンを使用していない場合は、表示されている動作を作成するタイムゾーンが簡単に一致しないことがあります。 UTC形式のjava Dateを試してみて、あなたのデータベース日付をUTC形式で見て、期待どおりの行が並んでいるかどうかを確認してください。

+0

私は決して日付のタイムゾーンやsimillarを扱っていなかったので、私はすべてのデータをasililateする必要がありますので少しオーバーフローしています。いくつかのドキュメント(https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html)を読んだ後、私の最初の質問は:MySQLでDATETIMEを正しく理解していれば、そのような値を取得するときにタイムゾーンが追加されますか? amishraが言っているように、値を完全に比較するために値を "そのまま"回復する場合は、単に日付をフォーマットする必要がありますか? –

+0

ここでmysqlのタイムゾーンについて読むことができます:http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html –

+0

Dateオブジェクトではなく文字列を渡すので、その点は無関係です。あなたが渡した日付が正しいことを確認してください。メソッドに日付を渡すために使用するコードを表示していないので、正しいかどうかはわかりません。 –

0

それがコードから渡された値と、その後

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

まあdatabseに渡す前の日付値の書式を変更するためのSimpleDateFormatを使用してデータベースに期待値との間に日付形式の不一致がある場合には、I問題を発見した。 Compare Date Java to DateTime Column in database table using SQLに記載されているように、日付を設定するために ".setDate"関数を使用していましたが、このような関数は時間の部分を切り捨てて問題になりました。今私は日付と時刻の両方の部分を使用する ".setTimestamp"を使用しています。 あなたのおかげで、私はTimeZonesについて多くのことを学びました!

関連する問題