2016-11-30 25 views
0

Ich arbeite mit Hibernate 4.3.8.Final, Primefaces 6.0 und MySQL-Datenbank 5.7.13. Ich habe eine Tabelle in der Datenbank mit dieser Struktur:Falsche Datumsauswahl in 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; 

Und die folgenden Daten mit Eichhörnchen mit der folgenden SQL extrahiert:

select * from rents 

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

In meinem Java Bean habe ich die folgende Funktion:

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; 
} 

ich die Web-App Debugging durchführen und die Daten, dass die Funktion erhält, sind:

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

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

Und es gibt keine Aufzeichnung überhaupt.

Wenn ich die gleiche SQL in Eichhörnchen auszuführen, die Art und Weise:

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

Es einen Datensatz zurückgibt.

Ich vermute, dass dies ein Datentypenproblem oder etwas ähnliches ist, aber nach der Recherche im Internet ist es mir nicht klar.

Kann mir jemand helfen?

Vielen Dank im Voraus!

+0

Wenn Sie ein Protokollierungsframework verwenden, versuchen Sie, Hibernate [SQL-Level-Protokollierung] (http://stackoverflow.com/a/2536835/1255737) einzuschalten, um sicherzustellen, dass die Abfrage tatsächlich ausgeführt wird. – rmlan

Antwort

0

Die Klasse java.util.Date verarbeitet keine Zeitzonen. Wenn Sie nicht dieselbe Zeitzone sowohl in der Date-Instanz als auch in den Datenbankfeldern verwenden, können die Zeitzonen, die das angezeigte Verhalten erzeugen, nicht übereinstimmen. Versuchen Sie, das Java-Datum im UTC-Format anzuzeigen, und sehen Sie sich das Datum Ihrer Datenbank im UTC-Format an und prüfen Sie, ob sie sich wie erwartet anordnen.

+0

Ich hatte noch nie mit Datumszeitzonen oder simillar und ich bin ein wenig übergelaufen, weil alle Daten, die ich haben, zu vereinfachen. Nach dem Lesen einiger Dokumentation (https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html) meine erste Frage ist: Wenn ich DATETIME in MySQL richtig verstanden habe speichert nicht Zeitzone, Beim Abrufen solcher Werte wird eine Zeitzone hinzugefügt? Falls der Wert "so wie er ist" wiederhergestellt wird, um einen perfekten Vergleich zwischen ihnen zu machen, sollte ich einfach das Datum formatieren, wie amishra sagt? –

+0

Hier können Sie über mysql Zeitzonen lesen: http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html –

+0

Da übergeben Sie ein Date-Objekt und nicht eine Zeichenfolge formatieren bei dieser Punkt ist irrelevant. Stellen Sie nur sicher, dass das Datum, das Sie übergeben, korrekt ist. Da Sie uns nicht den Code gezeigt haben, den Sie verwenden, um das Datum an die Methode zu übergeben, können wir Ihnen nicht sagen, ob es richtig ist oder nicht. –

0

Wenn es ein Datumsformat Diskrepanz zwischen den Werten aus dem Code und die erwarteten Werte in der Datenbank übergeben wird, dann Simple verwenden das Format der Datumswerte zu ändern, bevor

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

Nun zu databse auf vorbei, ich habe das Problem gefunden. Wie in Compare Date Java to DateTime Column in database table using SQL angegeben, habe ich die ".setDate" -Funktion verwendet, um die Daten zu setzen, eine solche Funktion schneidet den Zeitteil ab, das war das Problem. Jetzt verwende ich den ".setTimestamp", der sowohl Datums- als auch Zeitteile verwendet. Vielen Dank an alle für Ihre Hilfe, ich habe viel über TimeZones gelernt!