在PostgreSQL中存储时间戳会出错:“无法将类型bigint转换为没有时区的时间戳”

时间:2015-06-05 06:24:17

标签: postgresql jdbc

我用以下代码创建了我的表:

CREATE TABLE "STORES" (
        "STOREGLOBALID"         SERIAL NOT NULL ,
        "STOREUPDATEDATETIME"   TIMESTAMP NOT NULL,
        "CHAINID"               BIGINT ,
        "CHAINNAME"             VARCHAR(50) ,
        "SUBCHAINID"            SMALLINT ,
        "SUBCHAINNAME"          VARCHAR(50) ,
        "STOREID"               SMALLINT ,
        "STORENAME"             VARCHAR(50) ,
        "STORETYPE"             SMALLINT ,
        "ADDRESS"               VARCHAR(50) ,
        "CITY"                  VARCHAR(50) ,
        PRIMARY KEY ("STOREGLOBALID")
);

当我尝试使用以下SQL准备语句时插入时间戳:

 INSERT INTO  "STORES" 
            ("STOREGLOBALID",
            "STOREUPDATEDATETIME",
            "CHAINID",
            "CHAINNAME",
            "SUBCHAINID",
            "SUBCHAINNAME",
            "STOREID",
            "STORENAME",
            "STORETYPE",
            "ADDRESS",
            "CITY") 
            VALUES (DEFAULT, cast(? as timestamp), ?, ?, ?, ?, ?, ?, ?, ?, ?)

以下Java代码:

ps = con.prepareStatement(sql);
ps.setLong(1, store.getChainId());
ps.setTimestamp(2, new Timestamp(1000000000)); //this value is only for test purposes, actual value gives the same error

我收到以下错误:

  

无法在没有时区的情况下将类型bigint强制转换为时间戳位置:235

我知道我需要提供时间戳,但是当我按照以下方式执行时:

ps.setTimestamp(2, new Timestamp(1000000000), Calendar.getInstance(TimeZone.getTimeZone("UTC")));

我得到了同样的错误。我究竟做错了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

准备好的陈述的第一个参数用于

cast(? as timestamp)

,结果存储在TIMESTAMP类型的STOREUPDATEDATETIME中。而你传递的是一个很长的(store.getChainId())参数。所以你试图把很长的时间戳到时间戳。

准备好的语句的第二个参数存储在BIGINT类型的CHAINID中。并且您将时间戳作为参数传递(new Timestamp(1000000000))。所以PostgreSQL试图将这个时间戳转换为bigint。

SQL应该是

INSERT INTO  "STORES" 
        ("STOREGLOBALID",
        "STOREUPDATEDATETIME",
        "CHAINID",
        "CHAINNAME",
        "SUBCHAINID",
        "SUBCHAINNAME",
        "STOREID",
        "STORENAME",
        "STORETYPE",
        "ADDRESS",
        "CITY") 
        VALUES (DEFAULT, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

Java应该是

ps.setTimestamp(1, new Timestamp(1000000000));
ps.setLong(2, store.getChainId());