ORA-01830: 日期格式图片在转换整个输入字符串之前结束/选择日期查询的总和
Posted
技术标签:
【中文标题】ORA-01830: 日期格式图片在转换整个输入字符串之前结束/选择日期查询的总和【英文标题】:ORA-01830: date format picture ends before converting entire input string / Select sum where date query 【发布时间】:2013-12-11 17:32:39 【问题描述】:我正在尝试像这样通过 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 中执行相同的查询时,它工作得很好。我已经在互联网上进行了搜索,我猜问题是查询中日期的数据类型,应该是Date,但我尝试的所有方法都不起作用......
我是编程初学者,如果您能尽可能简单地解释它,那就太好了!提前致谢!
【问题讨论】:
您可以输入: 选择 SUM(A) 作为 NCCSeptember from NCC where Datum between to_date('01-09-2013 00:00:00') 和 to_date('30-09-2013 23: 59:59') 【参考方案1】:我认为你不应该依赖隐式转换。这是一种不好的做法。
你应该这样尝试:
datenum >= to_date('11/26/2013','mm/dd/yyyy')
或喜欢
datenum >= date '2013-09-01'
【讨论】:
日期文字格式(第二个选项)不正确。应该是yyyy-mm-dd
(date '2013-09-01'
)。此外,在比较日期时要考虑日期的时间部分。
@NicholasKrasnov:- 感谢您的更新!也更新了我的答案!
我刚刚尝试了第一个解决方案,它成功了!如果我在 SQL Developer 中将日期戳的设置更改为“DD/MM/RRRR HH24:MI:SS”以添加时间并更改月份和日期的顺序,则应为“to_date('26/11/2013 14:34 :45','dd/mm/yyyy hh24:mm:ss')" 有效吗? PS:非常感谢您的快速回答!
我收到了这个错误,因为我只是在当年的 'YYYY' 模式中忘记了一个 'y'【参考方案2】:
你可以试试这个:
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/
【讨论】:
【参考方案3】:您在 sql 字符串中写入的是 Timestamp
而不是 Date
。您必须将其转换为 Date
或将数据库字段的类型更改为 Timestamp
才能正确显示。
【讨论】:
【参考方案4】:在 SQL Developer 中..转到 Preferences-->NLS-->并相应地更改日期格式
【讨论】:
【参考方案5】:你可以尝试如下它对我有用
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,您可以独立比较唯一的日期部分,而时间部分将跳过。
【讨论】:
【参考方案6】:你可以使用
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
基本上我必须在我的 SP 中放置一个 DateFrom 和 DateTo 过滤器,所以我将日期作为字符串传递给它。
注意:这是对我有用的解决方案之一,这个问题可能还有更多解决方案。
【讨论】:
【参考方案7】:SELECT CAST(COLUMN_NAME AS DATE) FROM TABLE_NAME
【讨论】:
可以通过提供有关您提出的解决方案的更多见解来改进此答案。以上是关于ORA-01830: 日期格式图片在转换整个输入字符串之前结束/选择日期查询的总和的主要内容,如果未能解决你的问题,请参考以下文章
ORA-01830: 日期格式图片在转换整个输入字符串之前结束
我在解析 XML 文件时收到 ORA-01830:日期格式图片在转换整个输入字符串之前结束
[技术分享]20171129_mybatis _ ORA-01830: 日期格式图片在转换整个输入字符串之前结束