【问题标题】:Storing timestamp in PostgreSQL gives an error: "cannot cast type bigint to timestamp without time zone"在 PostgreSQL 中存储时间戳会出现错误:“无法将类型 bigint 转换为没有时区的时间戳”
【发布时间】:2015-08-20 00:01:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: postgresql jdbc


    【解决方案1】:

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

    cast(? as timestamp)
    

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

    准备好的语句的第二个参数存储在 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());
    

    【讨论】:

    • 谢谢,我将在 7 分钟内接受您的答复。证明有时候看代码需要另外一双眼睛。
    猜你喜欢
    • 2020-11-10
    • 2014-02-12
    • 2017-11-15
    • 2017-04-25
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2014-08-21
    • 2013-02-08
    相关资源
    最近更新 更多