10

Sto provando ad inserire un timestamp con il fuso orario del mio DB una stringa che include data, ora e fuso orario usando la dichiarazione preparata.Come posso inserire timestamp con fuso orario in postgresql con istruzione preparata?

Il problema è che la funzione Timestamp.valueof non prende in considerazione il fuso orario in cui la stringa si inserisce in modo da provocare un errore. Il formato accettato è yyyy- [m] m- [d] d hh: mm: ss [.f ...] che non menziona il fuso orario.

Questo è il codice esatto che causa l'errore:

pst.setTimestamp (2, Timestamp.valueOf ("2012/08/24 14:00:00 +02: 00"))

C'è un modo per superarlo? Grazie in anticipo!

risposta

1

Credo che si possa utilizzare un altro campo nel database, che includerebbe il fuso orario. E calcolare manualmente l'ora dopo aver ottenuto questi due campi

+0

Ok questo è un approccio accettabile, ma mi piacerebbe sapere se c'è un modo per farlo con il modo sopra menzionato. –

3

Il problema di base è che un java.sql.Timestamp non contiene informazioni sul fuso orario. Penso che si presuma sempre che sia "fuso orario locale".

Sulla soluzione mi viene in mente è di non usare un parametro in una PreparedStatement, ma un fuso orario letterale SQL:

update foo 
    set ts_col = timestamp with time zone '2012-08-24 14:00:00 +02:00'`; 

Un'altra possibile soluzione potrebbe essere quella di passare una stringa formattata correttamente ad un prepareStatement che utilizza to_timestamp():

String sql = "update foo set ts_col = to_timestamp(?, 'yyyy-mm-dd hh24:mi:ss')"; 
PreparedStatement pstmt = connection.prepareStatement(sql); 
pstmt.setString(1, "2012-08-24 14:00:00 +02:00"); 
+0

Non dovremmo includere nel formato data di to_timestamp() il fuso orario? –

+0

@MichelangeloVandilakis: è incluso nel secondo esempio (è subito dopo il segnaposto '?'). Il primo esempio è * non * una chiamata a 'to_timstamp()' ma un timestamp * letterale * che deve seguire regole specifiche. –

+0

forse non l'ho scritto bene. Voglio dire che il formato include solo l'anno, il mese, le ore del giorno, i minuti, i secondi, ma nulla per mostrare che il fuso orario è incluso –

Problemi correlati