JDBC 错误:运算符不存在:日期 = 整数

Posted

技术标签:

【中文标题】JDBC 错误:运算符不存在:日期 = 整数【英文标题】:JDBC ERROR: operator does not exist: date = integer 【发布时间】:2013-04-18 01:35:04 【问题描述】:
    String checkAvailable_flight = String.format("SELECT Flightid, flightdate,"
            + " origin, destination FROM flight"
            + " WHERE  Flightdate::Date = %s  AND origin = %s"
            + " AND destination = %s;", date_, origin_, destination_);

    ResultSet rs = stmt.executeQuery(checkAvailable_flight);

    if (!rs.next()) 

        System.out.println("no data inserted");
     else 

        do 
            int flightid = rs.getInt("flightid");
            String date = rs.getString("flightdate");
            String origin = rs.getString("origin");
            String destination = rs.getString("destination");

            System.out.printf("%-10d %5s %5s %7s\n",flightid, date, origin, destination);

         while (rs.next());
    

发生错误:

SQLException : ERROR: operator does not exist: date = integer
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  Position: 86
SQLState : 42883
SQLCode : 0

你好,我正在使用 JDBC,想执行 sql 查询并打印出表格..但我得到了上面的错误..

我尝试以另一种方式投射航班日期,例如:

CAST(Flightdate AS TEXT) LIKE '2013-04-12%' 

但错误仍然发生......

任何建议都会不胜感激..

【问题讨论】:

时间戳类型的航班日期... 请阅读bobby-tables.com,en.wikipedia.org/wiki/SQL_injection 【参考方案1】:

我猜您的日期可能会被替换而不引用,例如 2012-01-01 而不是 '2012-01-01'2012-01-01 是一个整数数学表达式,其结果为数字 2010,因此您将日期与整数进行比较。你需要引用你的日期,或者更好的是,使用适当的准备好的陈述。

为什么使用准备好的语句?

做对更容易 lil' bobby tables Wikipedia: SQL Injection

为了证明我认为您的代码存在的问题,我认为您正在这样做:

regress=> SELECT DATE '2012-03-12' = 2012-03-12;
ERROR:  operator does not exist: date = integer
LINE 1: SELECT DATE '2012-03-12' = 2012-03-12;
                                 ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

观察:

regress=> \x
Expanded display is on.
regress=> SELECT 
              2012-03-12 AS unquoted,
              pg_typeof(2012-03-12) AS unquotedtype,
              '2012-03-12' AS quoted,
              pg_typeof('2012-03-12') AS quotedtype, 
              DATE '2012-03-12' AS typespecified,
              pg_typeof(DATE '2012-03-12') AS typespecifiedtype;
-[ RECORD 1 ]-----+-----------
unquoted          | 1997
unquotedtype      | integer
quoted            | 2012-03-12
quotedtype        | unknown
typespecified     | 2012-03-12
typespecifiedtype | date

(1 row)

如果您不使用预准备语句,请将 %s 替换为 DATE '%s',但使用预准备语句。

能否在格式化后添加一条语句来打印checkAvailable_flight的内容,然后将其输出粘贴到这里来确认或反驳我的猜测?

【讨论】:

以上是关于JDBC 错误:运算符不存在:日期 = 整数的主要内容,如果未能解决你的问题,请参考以下文章

修复错误:“运算符不存在:没有时区的时间戳>整数”错误

PostgreSQL:错误:运算符不存在:整数 = 字符变化

在数据迁移时,出现错误:运算符不存在:布尔 = 整数提示:没有运算符与给定的名称和参数类型匹配

导轨 3.1。 Heroku PGError:运算符不存在:字符变化=整数

错误:运算符不存在:字符变化 = bytea

使用整数字段通过按位运算存储选定的日期