Storing timestamp in PostgreSQL gives an error: "cannot cast type bigint to timestamp without time zone"

Storing timestamp in PostgreSQL gives an error: "cannot cast type bigint to timestamp without time zone"

我使用以下代码创建了我的 table:

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

我收到以下错误:

cannot cast type bigint to timestamp without time zone Position: 235

我知道我需要提供一个时间戳,但是当我这样做时:

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

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

准备好的语句的第一个参数用于

cast(? as timestamp)

结果存储在 STOREUPDATEDATETIME 中,类型为 TIMESTAMP。你传递了一个 long (store.getChainId()) 作为参数。因此,您正在尝试将 long 转换为时间戳。

准备好的语句的第二个参数存储在 CHAINID 中,类型为 BIGINT。并且您将时间戳作为参数传递 (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());