java.sql.SQLException:ORA-01843:不是有效的月份错误-日期格式转换问题

时间:2019-02-22 16:21:18

标签: sql date jsp

我在查询中遇到一个奇怪的问题,我试图从中提取通过开始日期和结束日期参数查询的数据。

我正在执行以下操作。

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
String preparedQuery = "SELECT ID, FULNAME, FRMEMAIL,    LOCATION,TYPE1,TYPE2,BORROWER_NAME,LOAN_NUM,TIME_REQ
FROM FORM_REDUCVU WHERE to_date(TIME_REQ,'yyyy-mm-dd') >= ?  AND to_date (TIME_REQ,'yyyy-mm-dd') <= ? ORDER BY ID DESC";
java.util.Date util_StartDate = sdf.parse( request.getParameter("time_req_date") );
java.sql.Date timreq_datevar1 = new java.sql.Date( util_StartDate.getTime() );
java.util.Date util_EndDate = sdf.parse( request.getParameter("time_req_date2") );
java.sql.Date timreq_datevar2 = new java.sql.Date( util_EndDate.getTime() );
out.println("datestamp java time vals "+timreq_datevar1 + " " + timreq_datevar2);
PreparedStatement prepstmt = connection.prepareStatement(preparedQuery);
prepstmt.setDate(1, timreq_datevar1);
prepstmt.setDate(2, timreq_datevar2);

并且out.print值将给出类似2018-10-09和2019-02-20的信息。 这确实与我正在选择的日期选择器相匹配,它们的格式为mm / dd / yyyy,即10/09/2018和02/20/2019。

现在,以上内容在日志中未返回任何错误,但也没有数据。但是我确实将SQL查询显示为“     WHERE to_datechar(TIME_REQ,'mm/dd/yyyy') >= ? AND to_char(TIME_REQ,'mm/dd/yyyy') <= ?

更改为以上内容时,出现主题无效月份的错误。

我本以为SimpleDateFormat类会将日期解析为模式中的mm / dd / yyyy,但是它似乎使java.slq.Date对象模式带有连字符,例如yyyy-mm-dd。

我解析不正确吗?还是这将需要其他类或包,例如java.Time?我以为这会起作用,但是必须有一些小的转换方法不起作用。 底线-我真的更希望保持jQuery日期选择器的mm / dd / yyyy格式完好无损,并能够通过这些条目进行查询。 欢迎对此提出任何意见。 谢谢!

1 个答案:

答案 0 :(得分:2)

不要不要在已经有DATE的列上使用to_date() to_date()会将日期转换为varchar只是将其转换回原本的DATE首先。

所以您的情况应该是:

WHERE TIME_REQ >= ?  AND TIME_REQ <= ?

您正确使用了setDate(),因此Oracle执行了日期与日期的比较-无需将数据库中的日期转换为字符串值。

理想情况下,您应该使用java.time.LocalDatesetObject()而不是java.sql.Date(但是,并非所有Oracle驱动程序版本都支持)