2010-05-18 26 views
17

estoy usando PreparedStatement con marca de tiempo en la cláusula where:PreparedStatement y setTimestamp en JDBC de Oracle

PreparedStatement s=c.prepareStatement("select value,utctimestamp from t where utctimestamp>=? and utctimestamp<?"); 
s.setTimestamp(1, new Timestamp(1273017600000L)); //2010-05-05 00:00 GMT 
s.setTimestamp(2, new Timestamp(1273104000000L)); //2010-05-06 00:00 GMT 
ResultSet rs = s.executeQuery(); 
if(rs.next()) System.out.println(rs.getInt("value")); 

El resultado que se ve es diferente, cuando tenga diferentes zonas horarias en el equipo cliente. ¿Es esto un error en Oracle jdbc? o corregir el comportamiento?

La versión de la base de datos Oracle es 10.2 y he intentado con la versión 10.2 y 11.1 del controlador jdbc de Oracle oracle.

El parámetro es Indicación de fecha y hora, y esperaba que no se realizarán conversiones de tiempo en el camino. El tipo de columna de la base de datos es DATE, pero también lo comprobé con el tipo de columna TIMESTAMP con los mismos resultados.

¿Hay alguna manera de lograr el resultado correcto? No puedo cambiar la zona horaria predeterminada en toda la aplicación a UTC.

Gracias por su ayuda

+0

Por favor edite su pregunta y agregue los tipos de t_begin y t_end. –

Respuesta

22

Para establecer un valor de marca de tiempo en un PreparedStatement en zona UTC uno debe utilizar

stmt.setTimestamp(1, t, Calendar.getInstance(TimeZone.getTimeZone("UTC"))) 

El valor de marca de hora siempre es UTC, pero no siempre el controlador JDBC puede enviar automáticamente correctamente al servidor. El tercer parámetro, Calendario, ayuda al controlador a preparar correctamente el valor para el servidor.

+3

En realidad, es: setTimestamp (int parameterIndex, Timestamp x, Calendar cal) – rhu

+1

En mi configuración de entorno, un objeto de calendario con una zona horaria diferente tiene efecto en los datos de SQL que se escriben. – Robert

Cuestiones relacionadas