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();

我想数据库中的正确值应该是(关于我的本地时区是 EET (+02))

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

但是使用 pgadmin 我检查了值,我得到了

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

有什么建议么?

4

2 回答 2

6

考虑使用setTimestamp()方法而不是setString()方法。检查此链接以了解如何使用PreparedStatement

编辑:正如我在评论中解释的那样,使用三个参数检查 setTimestamp()的API 参考:

使用给定的 Calendar 对象将指定参数设置为给定的 java.sql.Timestamp 值。驱动程序使用日历对象构造一个 SQL TIMESTAMP 值,然后驱动程序将其发送到数据库。使用 Calendar 对象,驱动程序可以在考虑自定义时区的情况下计算时间戳。如果未指定日历对象,则驱动程序使用默认时区,即运行应用程序的虚拟机的时区。

于 2012-12-03T23:49:50.157 回答
4

Federico Cristina 说得很对,这setTimestamp是正确的做法。

语法错误的原因是您在传递参数时无法使用前导类型说明符指定类型。该INTEGER '4'样式仅对文字有效,对参数无效。

您的代码将PREPAREd 然后EXECUTEd 在协议级别。如果我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 回答