10

Próbuję wstawić do znacznika czasu z pola strefy czasowej mojego DB ciąg znaków, który zawiera datę, godzinę i strefę czasową za pomocą przygotowanego oświadczenia.Jak mogę wstawić znacznik czasu z timezone w postgresql z przygotowanym oświadczeniem?

Problem polega na tym, że funkcja Timestamp.valueof nie uwzględnia strefy czasowej, którą zawiera ciąg znaków, co powoduje błąd. Akceptowanym formatem jest rrrr [m] m- [d] d gg: mm: ss [.f ...], który nie wspomina o strefie czasowej.

To jest dokładny kod, który powoduje błąd:

pst.setTimestamp (2, Timestamp.valueOf ("24.08.2012 14:00:00 +02: 00"))

Czy istnieje sposób, że mogę go pokonać? Z góry dziękuję!

Odpowiedz

1

Sądzę, że można użyć jeszcze jednego pola w bazie danych, które zawierałoby strefę czasową. I obliczyć czas ręcznie po uzyskaniu tych dwóch pól.

+0

Ok to akceptowalne podejście, ale chciałbym wiedzieć, czy jest jakikolwiek sposób robienia tego przez wyżej wspomniany sposób. –

3

Podstawowym problemem jest to, że java.sql.Timestamp nie zawiera informacji o strefie czasowej. Myślę, że zawsze przyjmuje się, że jest to "lokalna strefa czasowa".

Na rozwiązanie można myślę, jest, aby nie używać parametru w PreparedStatement, ale strefa czasowa dosłowny w SQL:

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

Innym możliwym rozwiązaniem byłoby przekazać prawidłowo sformatowany ciąg do prepareStatement który używa 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

Czy nie powinniśmy uwzględniać w formacie daty to_timestamp() strefę czasową? –

+0

@MichelangeloVandilakis: jest zawarty w drugim przykładzie (jest zaraz po znaku zastępczym '?'). Pierwszym przykładem jest * nie * wywołanie 'to_timstamp()', ale znacznik czasu * literalny *, który musi przestrzegać określonych reguł. –

+0

Może nie napisałem tego dobrze. Mam na myśli to, że format obejmuje tylko rok, miesiąc, godziny dnia, minuty, sekundy, ale nic nie wskazuje na to, że strefa czasowa jest włączona. –

Powiązane problemy