ORA-01830: изображение формата даты заканчивается перед преобразованием всей входной строки / выберите сумму, где запрос даты

Я пытаюсь выполнить свой запрос через Java следующим образом:

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, он работает просто отлично. Я уже сделал поиск по интернету, и я думаю, проблема заключается в типе данных даты в запросе, который должен быть датой, но все, что я пробовал, не сработало...

Я новичок в программировании, поэтому было бы здорово, если бы все так просто можно объяснить! Заранее спасибо!

6 ответов


Я думаю, что вы не должны полагаться на неявное преобразование. Это плохая практика.

вместо этого вы должны попробовать так:

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

или как

datenum >= date '2013-09-01'

вы можете попробовать это:

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/


то, что вы написали в своей строке sql, является Timestamp не Date. Вы должны преобразовать его в Date или измените тип поля базы данных на Timestamp для того, чтобы это было видно правильно.


в SQL Developer ..Перейдите в Настройки-->NLS-->и измените формат даты соответственно


вы можете попробовать, как это работает для меня

select * from nm_admission where trunc(entry_timestamp) = to_date('09-SEP-2018','DD-MM-YY');

или

select * from nm_admission where trunc(entry_timestamp) = '09-SEP-2018';

вы также можете попробовать использовать to_char, но помните, что to_char слишком дорого

select * from nm_admission where to_char(entry_timestamp) = to_date('09-SEP-2018','DD-MM-YY');

TRUNC (17-SEP-2018 08:30:11) даст 17-SEP-2018 00:00: 00 в результате вы можете сравнить только часть даты независимо и часть времени будет пропускать.


можно использовать

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

Если вы используете его в SP, то ваш переменный тип данных должен быть Varchar2

а также в вашем ado.net код тип данных вашего входного параметра должен быть

OracleDbType.Varchar2

В основном мне пришлось поместить DateFrom и DateTo фильтр в мой SP, поэтому я передал даты как строку в нем.

Примечание: это одно из решений, которое сработало для меня, может быть больше решений для эта проблема.