oracle
  • date
  • select
  • ora-01830
  • 2013-11-26 27 views 22 likes 
    22

    我试图通过Java这样执行我的查询:ORA-01830:转换整个输入字符串/选择和食用日期格式图片的结束位置日期查询

    public ResultSet execSumStatment2() throws SQLException{ 
    String query = "Select SUM(A) as NCCSeptember from NCC where Datum >= '01-09-2013 00:00:00' and Datum <= '30-09-2013 23:59:59'"; 
    return execStatement(query); 
    } 
    

    然后调用execSumStatement在类:

    sql.execSumStatement2() ; 
    

    当我运行它,我收到以下错误信息:

    java.sql.SQLDataException:ORA-01830:日期格式图片将整个输入字符串

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) 
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) 
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513) 
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) 
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208) 
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:886) 
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1175) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1296) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613) 
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3657) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1495) 
    at com.bachelorarbeit.SQLExecutor.execStatement(SQLExecutor.java:20) 
    at com.bachelorarbeit.SQLExecutor.execSumStatment2(SQLExecutor.java:56) 
    at com.bachelorarbeit.Test.doGet(Test.java:63) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
    

    当我执行在SQL Developer中相同的查询它只是罚款之前结束。我已经通过互联网进行了搜索,我猜问题是查询中日期的数据类型,它应该是Date,但是我尝试过的所有东西都不起作用...

    我是初学者编程,所以如果你能够尽可能简单地解释它,那将是非常棒的!提前致谢!

    回答

    25

    我认为你不应该依赖隐式转换。这是一个不好的做法。

    相反,你应该尝试这样的:

    datenum >= to_date('11/26/2013','mm/dd/yyyy') 
    

    或类似

    datenum >= date '2013-09-01' 
    
    +2

    日期文字格式(第二个选项)不正确。它应该是'yyyy-mm-dd'('date'2013-09-01'')。此外,比较日期时考虑日期的时间部分。 –

    +0

    @NicholasKrasnov: - 感谢您的更新!更新我的答案! –

    +1

    我刚试过第一个解决方案,它工作!如果我在SQL Developer中将datestamp的设置更改为“DD/MM/RRRR HH24:MI:SS”以添加时间并更改月份和天数的顺序,应该“to_date('26/11/2013 14:34 :45','dd/mm/yyyy hh24:mm:ss')“work? PS:谢谢你的快速回答! – user3036627

    8

    你可以试试这个:

    Select To_date ('15/2/2007 00:00:00', 'DD/MM/YYYY HH24:MI:SS'), 
         To_date ('28/2/2007 10:12', 'DD/MM/YYYY HH24:MI:SS') 
        From DUAL; 
    

    来源:http://notsyncing.org/2008/02/manipulando-fechas-con-horas-en-plsql-y-sql/

    1

    你写在你的sql字符串里的是Timestamp而不是Date。您必须将其转换为Date或将数据库字段的类型更改为Timestamp,以便正确地看到它。

    0

    在SQL Developer中..Go首选项 - > NLS - >并更改日期格式相应

    0

    如果您在使用SP,那么你可以使用

    Select to_date('08/15/2017 12:00:00 AM','MM/DD/YYYY HH:MI:SS AM') from dual;

    您的变量的数据类型应该是Varchar2

    ,并在您的ado.net代码的输入参数的数据类型应该是

    OracleDbType.Varchar2

    基本上我不得不把DateFrom和DateTo过滤器放在我的SP中,所以我把日期作为String传递给它。

    备注:这是我工作的解决方案之一,可以有更多的解决方案来解决这个问题。

    相关问题