【发布时间】:2015-08-26 15:34:26
【问题描述】:
我试图在 oracle 数据库中插入一个日期,但我一直面临转换问题。
public List<Customer> getCustomerData(Date start, Date end) {
...
String query = "SELECT name FROM customers WHERE trunc(order_timestamp) between trunc(?) and trunc(?)";
DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
pst.setDate(1, new java.sql.Date(sdf.parse(sdf.format(start)).getTime()));
pst.setDate(2, new java.sql.Date(sdf.parse(sdf.format(end)).getTime()));
}
来自我的来电者
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date start = sdf.parse("10/10/2014");
Date end = sdf.parse("10/10/2016");
customerDao.getCustomerData(start,end);
我得到的错误是:
Caused by: org.h2.jdbc.JdbcSQLException: Data conversion error converting "2014-10-10"; SQL statement:
select name from customers where trunc(order_timestamp) between trunc(?) and trunc(?) [22018-160]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:158)
at org.h2.value.Value.convertTo(Value.java:852)
at org.h2.engine.FunctionAlias$JavaMethod.getValue(FunctionAlias.java:366)
at org.h2.expression.JavaFunction.getValue(JavaFunction.java:38)
at org.h2.expression.Comparison.getValue(Comparison.java:206)
at org.h2.expression.ConditionAndOr.getValue(ConditionAndOr.java:83)
at org.h2.expression.ConditionAndOr.getValue(ConditionAndOr.java:90)
at org.h2.expression.Expression.getBooleanValue(Expression.java:180)
at org.h2.command.dml.Select.queryFlat(Select.java:514)
at org.h2.command.dml.Select.queryWithoutCache(Select.java:617)
at org.h2.command.dml.Query.query(Query.java:298)
at org.h2.command.dml.Query.query(Query.java:268)
at org.h2.command.dml.Query.query(Query.java:37)
at org.h2.command.CommandContainer.query(CommandContainer.java:82)
at org.h2.command.Command.executeQuery(Command.java:185)
at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:96)
at com.customerDaoImpl.custDao.getParentContextdata(custDao.java:431)
... 29 more
Caused by: java.lang.NumberFormatException: For input string: "2014-10-10"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
at java.lang.Double.parseDouble(Double.java:510)
at org.h2.value.Value.convertTo(Value.java:831)
... 44 more
我认为发生的事情是 getTime() 会将日期重新格式化为 yyyy-MM-dd 格式,而输入是 n MM/dd/yyyy 格式。但我不确定这是否正是导致问题的原因。
编辑: H2 不支持 trunc 但您可以编写要调用的外部脚本。
在Customer.sql
drop ALIAS if exists TRUNC;
CREATE ALIAS TRUNC as '
import java.text.*;
@CODE
double trunc(double num) throws Exception {
return Math.floor(num*10) /10;
}
';
【问题讨论】:
-
如果您不确定输入的确切格式,您需要另一种格式 (
yyyy-MM-dd) 或帮助方法来尝试解析多种格式。 -
getTime() 返回毫秒数。它怎么可能重新格式化任何东西。发布 complete 异常堆栈跟踪。
-
听起来您需要两种日期格式:一种用于“yyyy-MM-dd”,另一种用于“MM/dd/yyyy”。 getTime() 返回自纪元以来的毫秒数。完全没有格式。
-
错误很明显:您发送日期为
"yyyy-MM-dd",而您的模式为"MM/dd/yyyy"。您希望它如何工作? -
我的问题是你为什么要这样做:
pst.setDate(1, new java.sql.Date(sdf.parse(sdf.format(start)).getTime()));当你可以这样做时:pst.setDate(1, new java.sql.Date(start.getTime()));?