2010-05-18 17 views
17

Sto usando PreparedStatement con data e ora in cui la clausola:PreparedStatement e setTimestamp in JDBC 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")); 

Il risultato che ottengo è diverso, quando ho fusi orari diversi sul computer client. Si tratta di un bug in Oracle jdbc? o comportamento corretto?

La versione del database Oracle è 10.2 e ho provato con oracle jdbc thin driver versione 10.2 e 11.1.

Il parametro è Timestamp e mi aspettavo che non si verifichino conversioni di tempo. Il tipo di colonna del database è DATE, ma l'ho anche verificato con il tipo di colonna TIMESTAMP con gli stessi risultati.

C'è un modo per ottenere risultati corretti? Non riesco a modificare il fuso orario predefinito nell'intera applicazione in UTC.

Grazie per il vostro aiuto

+0

Modifica la domanda e aggiungi i tipi di t_begin e t_end. –

risposta

22

Per impostare un valore di timestamp in un PreparedStatement nel fuso orario UTC si dovrebbe usare

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

il valore timestamp è sempre UTC, ma non sempre il driver JDBC può automaticamente inviato correttamente al server. Il terzo parametro Calendar consente al driver di preparare correttamente il valore per il server.

+3

In realtà, è: setTimestamp (int parameterIndex, Timestamp x, Calendar cal) – rhu

+1

Nel mio ambiente l'impostazione di un oggetto calendario con un fuso orario diverso ha effetto sui dati SQL scritti. – Robert

Problemi correlati