Ich stieß neulich auf ein ähnliches Problem, wo die Zeitkomponente von einigen Daten abgeschnitten wurde.
Wir haben es auf einen Unterschied in Oracle Driver-Versionen eingegrenzt.
Auf Oracle FAQ es einen Abschnitt über dieses ist:
select sysdate from dual; ...while(rs.next())
Vor 9201, wird dies zurück: getObject für sysdate: java.sql.Timestamp < < < < getDate für sysdate : java.sql.Date getTimetamp für sysdate: java.sql.Timestamp
Ab 9201 wird das folgende ret urned
getObject für sysdate: java.sql.Date < < < < < getDate für sysdate: java.sql.Date >> keine Änderung getTimetamp für sysdate: java.sql.Timestamp >> keine Änderung
Hinweis: java.sql.Date hat keinen Zeitabschnitt, während java.sql.Timestamp dies tut.
Mit dieser Änderung in der Datatype-Zuordnung werden einige Anwendungen fehlschlagen und/oder falsche Ergebnisse generieren, wenn der JDBC-Treiber von 8i/9iR1 auf 920x JBDC-Treiber aktualisiert wird. Um die Kompatibilität zu erhalten und die Anwendungen nach dem Upgrade funktionsfähig zu halten, wurde ein Kompatibilitätsflag bereitgestellt. Entwickler haben jetzt einige Optionen:
- Verwenden Sie oracle.jdbc.V8Compatible Flag.
JDBC-Treiber nicht Datenbank-Version standardmäßig erfassen. Um die Kompatibilitätsflag Änderungszeitmarke für den Umgang mit Datentypen, Verbindungseigenschaft
‚oracle.jdbc.V8Compatible‘
kann auf ‚true‘ gesetzt werden, und der Fahrer verhält, wie es in 8i erzogene, 901x, 9 200 (mit in Bezug auf TIMESTAMPs).
Standardmäßig ist das Flag auf 'false' gesetzt. Im OracleConnection-Konstruktor erhält der Treiber die Serverversion und setzt das Kompatibilitäts-Flag entsprechend.
java.util.Properties prop=newjava.util.Properties();
prop.put("oracle.jdbc.V8Compatible","true");
prop.put("user","scott");
prop.put("password","tiger");
String url="jdbc:oracle:thin:@host:port:sid";
Connection conn = DriverManager.getConnection(url,prop);
Mit JDBC 10.1.0.x kann die folgende Systemeigenschaft kann anstelle der Verbindungseigenschaft verwendet: java -Doracle.jdbc.V8Compatible = true ..... Hinweis: Dieses Flag ist ein Client Nur Flag, das die Timestamp- und Date-Zuordnung steuert. Es betrifft keine Datenbankfunktion.
'2. Verwenden Sie "set/getDate" und "set/getTimestamp", wenn Sie den Datentypen "Date" und "TimeStamp" entsprechend behandeln.
9i-Server unterstützt Datums- und Zeitstempel-Spaltentypen DATE ist java.sql.Date zugeordnet und TIMESTAMP ist java.sql.Timestamp zugeordnet.
Also für meine Situation hatte ich Code wie folgt:
import java.util.Date;
Date d = rs.getDate(1);
Mit 9i Ich war immer ein java.sql.Timestamp (die eine Unterklasse von java.util.Date ist) so alles war groovy und ich hatte meine Stunden und Minuten.
Aber mit 10g, der gleiche Code bekommt jetzt eine java.sql.Date (auch eine Unterklasse von java.util.Date, so dass es noch kompiliert), aber die HH: MM ist TRUNCATED !!.
Die zweite Lösung war ziemlich einfach für mich - einfach das getDate durch getTimestamp ersetzen und Sie sollten OK sein. Ich denke, das war eine schlechte Angewohnheit.
Stichwort ** ** wandelt, weshalb ich die 2 Stunden bekommen – n002213f
Ich bin verwirrt, ist, wenn Umwandlung richtig funktioniert, sollte er nicht ein Datum zu sehen, dass 2 Stunden weniger, statt mehr ? – wds
@wds - überprüfen Sie meine Bearbeitung und Antwort – n002213f