在查看大多数可能的解决方案之后,我仍然遇到这个例外:
ORA-01843: not a valid month
我的查询和查询调用看起来像这样
String sql = "select * from my_view "
+ "where TO_DATE(?, 'MM/DD/YYYY', 'NLS_DATE_LANGUAGE = American') "
+ "between enroll_date and suspend_date "
+ "order by last_name, first_name";
return new JdbcTemplate(dataSource)
.query(sql,
new Object[] { new java.sql.Date(dateOfCall.getTime()) },
new BeanPropertyRowMapper<MyDto>(MyDto.class)
);
dateOfCall的类型为
java.util.Date
答案 0 :(得分:2)
您已将其绑定为日期。因此,Oracle使用TO_CHAR()
隐式将其转换为字符串,格式为NLS_DATE_FORMAT
。
让我们假设NLS_DATE_FORMAT = 'DD/MM/YYYY'
说日期25th November 2014
隐式转换为25/11/2014.
现在TO_DATE()
MM/DD/YYYY
可能错误了,因为月份与25
映射在这里。
除非您在日期字符串中使用缩写月/日。只需日期即可。无需NLS_DATE_LANGUAGE
设置。
String sql = "select * from my_view "
+ "where ? "
+ "between enroll_date and suspend_date "
+ "order by last_name, first_name";