5

次のクエリを実行しようとしています

INSERT INTO hotspot(timestamp) VALUES 
(timestamp with time zone '2012-10-25 14:00:00 +05:00' at time zone 'EET');

タイムスタンプを変数として渡したい。

私のタイムスタンプ列は、タイムゾーン付きのタイムスタンプのタイプです。

これをどのように行うことができるか考えていますか?

いつ... (Java、Postgresql)

    String stm= "INSERT INTO hotspot(timestamp) VALUES(timestamp with time zone ? at time zone 'EET')";
    pst = con.prepareStatement(stm);
    pst.setString(1, "2012-08-24 14:00:00 +05:00");
    pst.executeUpdate();

「$1」またはその付近で構文エラーが発生します

とにかく私はこのエラーを克服することができますか?? 前もって感謝します!!

更新:次の方法で setTimestamp を使用しようとしました...

Calendar c=Calendar.getInstance(TimeZone.getTimeZone("GMT+05:00"));
String stm= "INSERT INTO hotspot(timestamp) VALUES(?)";
pst = con.prepareStatement(stm);
pst.setTimestamp(1,Timestamp.valueOf("2012-01-05 14:00:00"), c );
pst.executeUpdate();

DBの正しい値は(私のローカルタイムゾーンがEET(+02)であることに関して)

2012-01-05 11:00:00 +02

しかし、pgadminを使用して値を確認すると、

2012-01-05 14:00:00 +02

助言がありますか?

4

2 に答える 2

6

setString()メソッドの代わりにsetTimestamp()メソッドを使用することを検討してください。PreparedStatementの使用方法を理解するには、このリンクを確認してください。

編集:コメントで説明したように、次の3つのパラメーターを使用してsetTimestamp()のAPIリファレンスを確認してください。

指定されたCalendarオブジェクトを使用して、指定されたパラメーターを指定されたjava.sql.Timestamp値に設定します。ドライバーはCalendarオブジェクトを使用してSQLTIMESTAMP値を作成し、それをデータベースに送信します。Calendarオブジェクトを使用すると、ドライバーはカスタムタイムゾーンを考慮してタイムスタンプを計算できます。Calendarオブジェクトが指定されていない場合、ドライバーはデフォルトのタイムゾーンを使用します。これは、アプリケーションを実行している仮想マシンのタイムゾーンです。

于 2012-12-03T23:49:50.157 に答える
4

setTimestampフェデリコ・クリスティーナは、これを行う正しい方法であると非常に正しいです。

構文エラーの理由は、パラメーターを渡すときに先頭の型指定子で型を指定できないためです。スタイルは、パラメーターではなくリテラルINTEGER '4'に対してのみ有効です。

コードは、プロトコル レベルでPREPAREdの次に d になります。EXECUTE私がそれをするとどうPREPAREなりますか:

regress=> PREPARE blah(timestamptz) AS INSERT INTO hotspot(timestamp) VALUES(timestamp with time zone $1 at time zone 'EET');
ERROR:  syntax error at or near "$1"
LINE 1: ...otspot(timestamp) VALUES(timestamp with time zone $1 at time...

データ型はクエリ パラメータで指定されるため、省略できます。代わりに次のように記述します。

String stm= "INSERT INTO hotspot(\"timestamp\") VALUES(? at time zone 'EET')";

"timestamp"これも予約語であるため、二重引用符で囲んだことに注意してください。一部のコンテキストでは引用符なしで機能しますが、他のコンテキストでは機能しません。列名としてデータ型名または予約語を選択することは、通常はお勧めできません。

于 2012-12-04T00:13:30.003 に答える