Me encontré con un problema similar el otro día donde el componente de tiempo se estaba truncando desde algunas fechas.
Hemos reducido a una diferencia en las versiones de Oracle Driver.
El FAQ de Oracle hay una sección acerca de esto:
select sysdate from dual; ...while(rs.next())
Antes de 9201, este volverá: getObject para sysdate: java.sql.Timestamp < < < < getDate para sysdate : java.sql.Date getTimetamp para sysdate: java.sql.Timestamp
A partir de 9201 en adelante, se aplicará el siguiente urned
getObject para sysdate: java.sql.Date < < < < < getDate para sysdate: java.sql.Date >> ningún cambio getTimetamp para sysdate: java.sql.Timestamp >> ningún cambio
Nota: java.sql.Date no tiene una porción de tiempo mientras que java.sql.Timestamp sí.
Con este cambio en el mapeo de tipos de datos, algunas aplicaciones fallarán y/o generarán resultados incorrectos cuando el controlador JDBC se actualice de 8i/9iR1 a 920x controlador JBDC. Para mantener la compatibilidad y mantener las aplicaciones funcionando después de la actualización, se proporcionó un indicador de compatibilidad. Los desarrolladores ahora tienen algunas opciones:
- Utilice la bandera oracle.jdbc.V8Compatible.
JDBC Driver no detecta la versión de la base de datos de manera predeterminada. Para cambiar el indicador de compatibilidad para el manejo de los tipos de datos timestamp, propiedad de conexión
'oracle.jdbc.V8Compatible'
se puede ajustar a 'verdadero' y el conductor se comporta como se comportó en 8i, 901x, 9 200 (con respecto a TIMESTAMPs).
De forma predeterminada, el indicador se establece en 'falso'. En el constructor de OracleConnection, el controlador obtiene la versión del servidor y establece la bandera de compatibilidad de forma adecuada.
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);
Con JDBC 10.1.0.x, en lugar de la propiedad de conexión, la siguiente propiedad del sistema se puede utilizar: java -Doracle.jdbc.V8Compatible = true ..... Nota: Esta bandera es un cliente única bandera que rige la asignación de marcas de tiempo y fecha. No afecta ninguna característica de la base de datos.
'2. Utilice set/getDate y set/getTimestamp al tratar con el tipo de datos de columna Fecha y Hora.
El servidor 9i admite los tipos de columna Fecha y Marca de tiempo DATE se asigna a java.sql.Date y TIMESTAMP se mapea a java.sql.Timestamp.
Así que para mi situación, tuve código como este:
import java.util.Date;
Date d = rs.getDate(1);
Con 9i que era conseguir una java.sql.Timestamp (que es una subclase de java.util.Date) así que todo era maravilloso y tenía mis horas y minutos.
Pero con 10g, el mismo código ahora obtiene un java.sql.Date (también una subclase de java.util.Date por lo que aún se compila) pero el HH: MM está TRUNCADO.
La segunda solución es bastante fácil para mí - simplemente reemplazar el getDate con getTimestamp y que debe estar bien. Supongo que fue un mal hábito.
palabra clave ** ** convierte, por lo que me sale de los +2 horas – n002213f
estoy confundido, si la conversión está funcionando adecuadamente, no se debe ver una fecha que es de menos de 2 horas, en lugar de más ? – wds
@wds - revisar mi edición y la respuesta – n002213f