我在查询中遇到一个奇怪的问题,我试图从中提取通过开始日期和结束日期参数查询的数据。
我正在执行以下操作。
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格式完好无损,并能够通过这些条目进行查询。 欢迎对此提出任何意见。 谢谢!
答案 0 :(得分:2)
不要不要在已经有DATE的列上使用to_date()
to_date()
会将日期转换为varchar只是将其转换回原本的DATE首先。
所以您的情况应该是:
WHERE TIME_REQ >= ? AND TIME_REQ <= ?
您正确使用了setDate()
,因此Oracle执行了日期与日期的比较-无需将数据库中的日期转换为字符串值。
理想情况下,您应该使用java.time.LocalDate
和setObject()
而不是java.sql.Date
(但是,并非所有Oracle驱动程序版本都支持)