代码之家  ›  专栏  ›  技术社区  ›  Robin

在Java代码中返回ORA-00904的日期格式,但在SQL开发人员中不返回

  •  0
  • Robin  · 技术社区  · 6 年前

    我正在使用spring jdbctemplate查询我的数据。


    我的代码中有以下查询

    static final String SQL = SELECT msgs.msg_submit_date MSG_DATE FROM {0}.messages msgs 
    WHERE TRUNC(msgs.msg_submit_date) 
    BETWEEN TO_DATE(:startDate,'YYYY-MM-DD') AND TO_DATE(:endDate,'YYYY-MM-DD') ;
    
    String formattedSQL = MessageFormat.format(SQL , new Object[] "sms.schema"});
    

    我得到一个 ORA-00904: "DD": invalid identifier 运行时出错。我想这是因为 msg_submit_date 列具有 HH:MI:SS 但是,我不想 时:分:秒 在我的Java代码中。有年、月、日就够了。

    另外,当我在oraclesqldeveloperide中运行同一个查询时,它运行得很好,没有任何错误,因此不确定出了什么问题。


    日期通过 java.time.LocalDate 使用以下格式:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/d/yyyy");
    

    返回以下字符串格式 2018-06-03 是的。

    JDBC调用:

    jdbcTemplate.query(formattedSQL, params, new MessagesRowMapper())
    

    我想可能是因为 MessageFormat 是的。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Alex Poole    6 年前

    错误是因为查询在执行时没有单引号;您可以使用以下命令获得相同的结果:

    SELECT msgs.msg_submit_date MSG_DATE FROM messages msgs
    WHERE TRUNC(msgs.msg_submit_date)
    BETWEEN TO_DATE(:startDate,YYYY-MM-DD) AND TO_DATE(:endDate,YYYY-MM-DD);
    
    ERROR at line 3:
    ORA-00904: "DD": invalid identifier
    

    日期格式组件被视为标识符,而不是字符串的一部分。

    您需要弄清楚为什么会发生这种情况——最有可能的解释是,尽管您在问题中发布了什么,但Java代码中的静态字符串中并没有它们,但是它们可能会被稍后的转换(例如 MessageFormat.format() 打电话来。

        2
  •  0
  •   Gordon Linoff    6 年前

    可以将查询编写为:

    SELECT msg_submit_date
    FROM messages
    WHERE submit_date >= DATE '2018-06-03' AND
          submit_date < DATE '2018-06-13';
    

    那么你就不必担心这个值的任何潜在时间成分了。

    也就是说,您的问题似乎是将数据移动到应用程序中。或许这将有助于:

    SELECT TRUNC(msg_submit_date)