0

我正在使用以下命令将记录插入我的数据库:

        PreparedStatement stmt = null;
        Connection conn = null;

        HashMap<String, Object> hoursMap = new HashMap<String, Object>();



        hoursMap.put("PLACE_ID", hours.getPlaceID());
        hoursMap.put("DAY", hours.getDayID());
        hoursMap.put("TIME_OPEN", hours.getTimeOpen());
        hoursMap.put("TIME_CLOSE", hours.getTimeClose());

        String insertStr = StatementCreator.insertQueryGenerator("HOURS",
                hoursMap);


        try {
            conn = ConnectionManager.getConnection();
            stmt = StatementCreator.createStatement(conn, insertStr, hoursMap,
                    false);

            returnVal = stmt.execute();
            ConnectionManager.closeStatement(stmt);
            System.out.println("Created");
        } catch (SQLException e) {
            System.out.println("ERROR");
            e.printStackTrace();
        } finally {
            ConnectionManager.closeConnection(conn);
        }

        return returnVal;
    }

但是,在运行此程序时,我收到以下错误:

org.postgresql.util.PSQLException:错误:列“TIME_OPEN”是带时区的时间类型,但表达式的类型是字符变化
提示:您需要重写或强制转换表达式。职位:71

我想不通是为什么?我这么说的原因是,如果我进入调试模式并查看内部准备好的语句,我会看到以下内容:

INSERT INTO "HOURS" ("TIME_OPEN","DAY","TIME_CLOSE","PLACE_ID")VALUES('11:30:00-0400',6,'23:59:59-0400',541)

我将它复制/粘贴到我的 SQL 编辑器中,它会运行并插入记录。

有什么我想念的吗?

4

2 回答 2

2

字符串文字和类型变量之间存在微妙但决定性的区别varchar

类似的字符串文字'11:30:00-0400'没有分配给它的类型。但是您的函数显然返回varchar,这与'11:30:00-0400'::varchar. 就像错误消息通知的那样,在这种情况下,您需要添加显式转换:

'11:30:00-0400'::varchar::timetz

或者,在你的情况下可能:

hours.getTimeOpen())::timetz

(不确定您使用的语法类型。)
或者让您的函数返回正确的类型。

不要使用timetz

顺便说一句,我强烈建议不要使用time with timezonetimetz简称)。这是一种逻辑上被破坏的类型。Postgres 仅提供它以实现标准兼容性,但建议不要使用它。我在这里引用手册

为了解决这些困难,我们建议在使用时区时使用包含日期和时间的日期/时间类型。我们不建议使用该类型time with time zone(尽管 PostgreSQL 支持旧应用程序并符合 SQL 标准)

这里:

该类型time with time zone由 SQL 标准定义,但该定义显示的属性会导致有用性受到质疑。在大多数情况下, 、 、 和 的组合datetime提供timestamp without time zone任何timestamp with time zone应用程序所需的完整范围的日期/时间功能。

于 2013-09-12T22:12:28.710 回答
1

如果只存储时间+时区,没有日期部分,则应在 PostgreSQL 端将数据类型声明为timetz(or time with time zone) 而不是timestamptz(or timestamp with time zone)。

于 2013-09-12T22:12:07.443 回答